Как использовать read() для чтения данных до конца файла?

Я пытаюсь читать двоичные данные в программе на 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);
}

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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