Пустой или “сброс” дескриптор файла без чтения ()?

(Примечание: Это не вопрос того, как сбросить a write(). Это - другой конец его, так сказать.)

Действительно ли возможно освободить дескриптор файла, к которому имеет данные, которые будут считаны в нем, не имея необходимость read() это? Вы не могли бы интересоваться данными, и чтение всего этого поэтому потратит впустую пространство и циклы, для которых у Вас могло бы быть лучшее использование.

Если это не возможно в POSIX, какие-либо операционные системы имеют какие-либо непортативные способы сделать это?

ОБНОВЛЕНИЕ: Обратите внимание на то, что я говорю о дескрипторах файлов, не потоках.

12
задан Teddy 27 December 2009 в 15:49
поделиться

6 ответов

Для потоков доступна функция 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

2
ответ дан 2 December 2019 в 21:02
поделиться

Ни read (), ни flush () не являются частью Standard C или C ++, но, конечно, ни одна из стандартных функций не поддерживает очистку входных потоков. Я предполагаю, что это отражает то, чего нет в базовых операционных системах. Обычный способ вообще не читать что-либо - это пропустить это с помощью какой-либо функции seek ().

1
ответ дан 2 December 2019 в 21:02
поделиться

Согласно this , система POSIX сделает это на fflush (stream); .

Для потока, открытого для чтения, если файл еще не находится в EOF, и файл может искать, смещение файла в нижележащем описании открытого файла должно быть скорректировано так, чтобы следующая операция над описанием открытого файла имеет дело с байтом после последнего, прочитанного или записанного в очищаемый поток.

0
ответ дан 2 December 2019 в 21:02
поделиться

Для POSIX используйте lseek(2) или lseek64(3) для поиска впереди. Для Windows используйте SetFilePointer() или SetFilePointerEx().

.
3
ответ дан 2 December 2019 в 21:02
поделиться

Если вы знаете количество пропущенных байтов, вы можете сделать lseek(fd, n, SEEK_CUR); для POSIX-систем. Также существует fseek() для объектов FILE *. В POSIX, я думаю, вы можете безопасно искать мимо конца файла, идея в том, что если позже будет записано больше данных, чтобы заставить данные пройти мимо позиции, установленной с помощью lseek(), то теперь вы сможете прочитать больше данных.

.
1
ответ дан 2 December 2019 в 21:02
поделиться

Если вы имеете дело с tty, посмотрите на tcflush():

#include <termios.h>
int tcflush(int fildes, int queue_selector);

После успешного завершения, tcflush() отбрасывает данные, записанные в объект на который ссылается fildes (открытый файловый дескриптор открытого файла, связанный с терминалом) но не переданные, или данные, полученные но не прочитанные, в зависимости от значения queue_selector [...]

http://opengroup.org/onlinepubs/007908775/xsh/tcflush.html

7
ответ дан 2 December 2019 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: