Как использовать read () для чтения данных до конца файла? - PullRequest
10 голосов
/ 05 июля 2010

Я пытаюсь прочитать двоичные данные в программе на C с помощью read (), но тест EOF не работает.Вместо этого он продолжает работать вечно, читая последний бит файла.

#include <stdio.h>
#include <fcntl.h>
int main() {

  // writing binary numbers to a file
  int fd = open("afile", O_WRONLY | O_CREAT, 0644);
  int i;
  for (i = 0; i < 10; i++) {
    write(fd, &i, sizeof(int));
  }
  close(fd);

  //trying to read them until EOF
  fd = open("afile", O_RDONLY, 0);
  while (read(fd, &i, sizeof(int)) != EOF) {
    printf("%d", i);
  }
  close(fd);
}

Ответы [ 3 ]

20 голосов
/ 05 июля 2010

read возвращает количество прочитанных символов. Когда он достигнет конца файла, он больше не сможет читать (вообще) и вернет 0, а не EOF.

3 голосов
/ 05 июля 2010

Вы должны проверить на ошибки.При некоторых (распространенных) ошибках, которые вы хотите вызвать read, снова!

Если read () возвращает -1, вы должны проверить errno для кода ошибки.Если errno равно EAGAIN или EINTR, вы хотите перезапустить вызов read() без использования его (неполных) возвращаемых значений.(В случае других ошибок вы можете выйти из программы с соответствующим сообщением об ошибке (из strerror))

Пример: оболочка с именем xread () из исходного кода git

0 голосов

POSIX rasys return == 0 для конца файла

http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html

Если ни у одного процесса нет открытого канала для записи, read () возвращает 0, чтобы указать конец файла.

Это подтверждает ответ Джерри .

EOF возвращается некоторыми функциями ANSI, например, man getc говорит:

fgetc (), getc () и getchar () возвращают символ, прочитанный как символ без знака, приведенный к int или EOF в конце файла или ошибки.

ungetc () возвращает c в случае успеха или EOF при ошибке.

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

См. Также: Как использовать EOF для запуска через текстовый файл в C?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...