Ответ 1
read
возвращает количество прочитанных символов. Когда он достигнет конца файла, он больше не сможет читать (вообще), и он вернет 0, а не EOF.
Я пытаюсь читать двоичные данные в программе на 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);
}
read
возвращает количество прочитанных символов. Когда он достигнет конца файла, он больше не сможет читать (вообще), и он вернет 0, а не EOF.
Вы должны проверить наличие ошибок. О некоторых (общих) ошибках, которые вы хотите вызвать снова читать!
Если read() возвращает -1, вы должны проверить errno
на код ошибки. Если errno равно либо EAGAIN
, либо EINTR
, вы хотите перезапустить вызов read()
, не используя его (неполные) возвращаемые значения. (При других ошибках вы, возможно, захотите выйти из программы с соответствующим сообщением об ошибке (от strerror))
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?