Почему POSIX API не имеет функции конца файла? - PullRequest
1 голос
/ 14 января 2012

В POSIX API, 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():

Ответы [ 2 ]

6 голосов
/ 07 июля 2013

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

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

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

0 голосов
/ 14 января 2012

Общий случай состоит в том, что программа будет иметь больше нуля байтов вводаТак что в общем случае программа должна будет выделить буфер.Проще не иметь специального случая для пустого ввода.

...