(Примечание: Это не вопрос того, как сбросить a write()
. Это - другой конец его, так сказать.)
Действительно ли возможно освободить дескриптор файла, к которому имеет данные, которые будут считаны в нем, не имея необходимость read()
это? Вы не могли бы интересоваться данными, и чтение всего этого поэтому потратит впустую пространство и циклы, для которых у Вас могло бы быть лучшее использование.
Если это не возможно в POSIX, какие-либо операционные системы имеют какие-либо непортативные способы сделать это?
ОБНОВЛЕНИЕ: Обратите внимание на то, что я говорю о дескрипторах файлов, не потоках.
Для потоков доступна функция fclean, которая очищает буфер записи и возвращает буфер чтения обратно в систему ввода-вывода.
http://www.gnu.org/software/hello/manual /libc/Cleaning-Streams.html
Если вы действительно хотите пропустить байты, правильным действием будет изменение положения указателя файла. Просто пропустите столько байтов, сколько не хотите читать.
http://www.gnu.org/software/hello/manual/libc/File-Position-Primitive.html#File-Position-Primitive
Ни read (), ни flush () не являются частью Standard C или C ++, но, конечно, ни одна из стандартных функций не поддерживает очистку входных потоков. Я предполагаю, что это отражает то, чего нет в базовых операционных системах. Обычный способ вообще не читать что-либо - это пропустить это с помощью какой-либо функции seek ().
Согласно this , система POSIX сделает это на fflush (stream);
.
Для потока, открытого для чтения, если файл еще не находится в EOF, и файл может искать, смещение файла в нижележащем описании открытого файла должно быть скорректировано так, чтобы следующая операция над описанием открытого файла имеет дело с байтом после последнего, прочитанного или записанного в очищаемый поток.
Для POSIX используйте lseek(2)
или lseek64(3)
для поиска впереди. Для Windows используйте SetFilePointer()
или SetFilePointerEx()
.
Если вы знаете количество пропущенных байтов, вы можете сделать lseek(fd, n, SEEK_CUR);
для POSIX-систем. Также существует fseek()
для объектов FILE *
. В POSIX, я думаю, вы можете безопасно искать мимо конца файла, идея в том, что если позже будет записано больше данных, чтобы заставить данные пройти мимо позиции, установленной с помощью lseek()
, то теперь вы сможете прочитать больше данных.
Если вы имеете дело с tty, посмотрите на tcflush()
:
#include <termios.h>
int tcflush(int fildes, int queue_selector);
После успешного завершения, tcflush() отбрасывает данные, записанные в объект на который ссылается fildes (открытый файловый дескриптор открытого файла, связанный с терминалом) но не переданные, или данные, полученные но не прочитанные, в зависимости от значения queue_selector [...]