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