2010-07-05 3 views
10

C 프로그램에서 이진 데이터를 read()로 읽으려고하는데 EOF 테스트가 작동하지 않습니다. 대신 파일의 마지막 비트를 영원히 계속 읽습니다.read()를 사용하여 파일 끝까지 데이터를 읽는 방법?

#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); 
} 
+2

아니 imediate 문제 (0을 반환하지 EOF를 읽기)하지만 당신은 아마 컴파일의 습관을한다고'GCC -Wall', 경고의 주를 가지고 (및 수정 :

도 참조하십시오!),'#include '를 사용한다. –

+0

조언을 주셔서 고마워, 내가 어디에 내가 필요하지만 내 벽면을 사용하여 내 주요 코드에 포함되어 있습니다 :) – sekmet64

답변

17

read은 읽은 문자 수를 반환합니다. 파일의 끝에 도달하면 더 이상 읽을 수 없으며 EOF가 아닌 0을 반환합니다.

+0

우 : S는 내가 그 설명서에 그걸 그리워하지 않았다, 그것은 지난 20 분 안에 고마워! – sekmet64

+0

글쎄, 나는 그것이 분명하지 않다는 것을 알 수있다. 결국 0 바이트가 읽힐 수있는 많은 이유를 생각할 수 있습니다. 핵심은 읽기가 오류가 발생하면 _always_는 -1을 반환하고 0은 반환하지 않는다는 것입니다. 0은 파일의 끝 부분에서 성공합니다. AFAICT, 비 블로킹 IO의 경우에도 가능하며 가능한 경우 0 바이트가 읽히고 0은 EOF에 도달 할 때만 반환됩니다. 나머지 시간에는 0 바이트가 읽혀지고 EOF에 도달하지 않았 으면 -1이 반환되고 errno = EAGAIN이 반환됩니다. 적어도 그것은 내 이해입니다. – enigmaticPhysicist

2

오류가 있는지 확인해야합니다. 다시 읽으려는 일부 (공통) 오류!

read()가 -1을 반환하면 오류 코드에 대해 errno을 검사해야합니다. errno가 EAGAIN 또는 EINTR 인 경우 반환 된 값을 사용하지 않고 read() 호출을 다시 시작하려고합니다. (기타 오류에, 당신은 아마도() 함수 strerror에서 적절한 오류 메시지와 함께 프로그램을 종료 할)

예 : a wrapper called xread() from git's source code

0

파일의 마지막에 대한 POSIX rasys 반환 == 0

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

파이프가 쓰기 용으로 열린 프로세스가없는 경우, read()는 파일 끝을 나타내는 0을 리턴합니다.

이것은 Jerry's answer을 확인합니다.

EOF은 일부 ANSI 함수 (예 : man getc는 말한다 :

는 fgetc(), getc 그룹()와 getchar가() 파일 또는 오류의 끝에있는 int 또는 EOF에 서명 숯불 캐스트로 읽을 수있는 문자를 리턴합니다.

ungetc()는 성공시 c를 반환하고 오류가 발생하면 EOF를 반환합니다.

이 경우 오류와 파일 끝을 구별하는 데 여전히 사용할 수 없으므로 feof이 필요합니다. How to use EOF to run through a text file in C?

관련 문제