Почему в POSIX API нет функции конца файла?

В API POSIX read() возвращает 0, чтобы указать, что конец файла достигнут. Почему нет отдельной функции, которая сообщает вам, что read() вернет ноль, не требуя от вас фактического вызова read()?


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

Что мы могли бы сделать...

while ( !eof )
   {
   allocate buffer
   read to buffer
   process buffer
   }

Что мы должны сделать вместо...

while ( true )
   {
   allocate buffer
   read to buffer
   if ( eof ) release buffer, break;
   process buffer
   }

Кроме того, похоже, что это поведение распространяется на API более высокого уровня, такие как fread() и feof() в C, и создает много путаницы в отношении того, как правильно использовать feof():


person Brent Bradburn    schedule 14.01.2012    source источник
comment
Самый интересный ответ, который я видел (на аналогичный вопрос): stackoverflow.com/a/5605161/86967. Нужно подумать, применима ли подобная логика к POSIX API.   -  person Brent Bradburn    schedule 20.11.2014
comment
Случай, когда размер входного потока в точности кратен размеру буфера, обычно встречается редко. Таким образом, конец потока не особенно полезен в типичных сценариях. Я точно не помню, но в то время, когда я задавал этот вопрос, я, возможно, работал со случаем, когда поток состоял из пакетов/фрагментов очень определенного размера (который также был достаточно большим, чтобы быть значительным) .   -  person Brent Bradburn    schedule 06.09.2018


Ответы (1)


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

Пример: в Linux при чтении из консоли новая строка, за которой следует ^D, приведет к тому, что posix::read() вернет ноль (указывая на «конец файла»). Однако, если программа не завершена, она может продолжить чтение (при условии, что введены дополнительные строки).

Поскольку конец потока не является постоянной ситуацией, возможно, имеет смысл даже не использовать функцию is_at_end() (в POSIX ее нет). К сожалению, это налагает дополнительную нагрузку на программиста (и/или библиотеку-оболочку) для элегантного и эффективного решения этой сложности.

person Brent Bradburn    schedule 07.07.2013