Как использовать 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);
}

3 ответов


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


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

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

пример: оболочка под названием xread() из источника git код


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 при ошибке.

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

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