2009-12-02 7 views
23

각 줄에 문자열이있는 텍스트 파일이 있습니다. 텍스트 파일의 각 행에 대해 숫자를 증가시키고 싶지만 파일의 끝에 도달하면 분명히 중지해야합니다. 나는 EOF에 대한 연구를 해보았지만 제대로 사용하는 법을 정말로 이해할 수 없었다.EOF를 사용하여 C에서 텍스트 파일을 실행하는 방법?

나는 while 루프가 필요하다고 가정하고 있지만 어떻게해야할지 모르겠다.

답변

67

EOF 또는 다른 오류가 발생합니다.

fgets() 사용 :

char buffer[BUFFER_SIZE]; 
while (fgets(buffer, sizeof buffer, stream) != NULL) 
{ 
    // process buffer 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted the read 
} 

fscanf() 사용 :

char buffer[BUFFER_SIZE]; 
while (fscanf(stream, "%s", buffer) == 1) // expect 1 successful conversion 
{ 
    // process buffer 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted the read 
} 

fgetc() 사용 :

int c; 
while ((c = fgetc(stream)) != EOF) 
{ 
    // process c 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted the read 
} 

fread() 사용 :

char buffer[BUFFER_SIZE]; 
while (fread(buffer, sizeof buffer, 1, stream) == 1) // expecting 1 
                // element of size 
                // BUFFER_SIZE 
{ 
    // process buffer 
} 
if (feof(stream)) 
{ 
    // hit end of file 
} 
else 
{ 
    // some other error interrupted read 
} 

형식은 모두 동일합니다. 읽기 작업 결과를 확인하십시오. 실패한 경우 다음 EOF를 확인하십시오. feof()은 끝을지나 읽을 시도한 한 때까지 true를 돌려주지 않기 때문에,

while(!feof(stream)) 
{ 
    fscanf(stream, "%s", buffer); 
    ... 
} 

이 양식은 사람들이가하는 생각하는 방법을 작동하지 않는 : 당신은 같은 예를 많이 볼 수 있습니다 파일의 결과적으로 루프는 너무 많은 시간을 하나씩 실행하므로 슬픔이 생길 수도 있고 그렇지 않을 수도 있습니다.

+0

좋은 답변이지만이 제안에 대한 몇 가지 제안은 다음과 같습니다. 1) "함수 : fOFanf() 결과가 EOF 또는 오류 : 예상보다 적은 성공적인 변환 횟수"는 입력 오류와 형식 변환 실패를 동일시합니다. IMO. 다른 열을 제안하십시오. 복잡한 함수입니다. 2) 맞춤법 검사 3) while (! feof (stream)) 예제에 "bad Code"주석을 제안하십시오. – chux

10

한 가지 가능한 C 루프는 다음과 같습니다

#include <stdio.h> 
int main() 
{ 
    int c; 
    while ((c = getchar()) != EOF) 
    { 
     /* 
     ** Do something with c, such as check against '\n' 
     ** and increment a line counter. 
     */ 
    } 
} 

는 지금, 나는 feof과 유사한 기능을 무시합니다. Exprience는 잘못된 시간에 그것을 호출하고 eof가 아직 도달하지 않았다는 믿음으로 두 번 무언가를 처리하는 것이 너무 쉽다는 것을 보여줍니다.

똥구멍을 피해야합니다 : char을 사용하십시오. c. getcharunsigned char 다음에 int에 캐스팅 된 다음 문자를 반환합니다. 즉 대부분의 플랫폼에서 EOF의 값과 c의 유효한 "char"값이 중복되지 않으므로 실수로 EOF을 '정상'인 char으로 감지하지 않습니다. 결과가 때문이었다 있는지 확인

function     result on EOF or error      
--------     ---------------------- 
fgets()     NULL 
fscanf()     number of succesful conversions 
          less than expected 
fgetc()     EOF 
fread()     number of elements read 
          less than expected 

확인 적절한 조건에 대한 입력 호출의 결과가 위, 다음 feof() 전화 : EOF 당신이 스트림을 읽을 때 사용하는 무엇에 따라 어떻게 감지

+0

당신이 정의한 eof – streetparade

+1

stdio.h 정의하지 못했습니다. –

+0

내 대답 참조 iof 정의 – streetparade

0

파일에서 읽은 후 EOF를 확인해야합니다.

fscanf_s     // read from file 
while(condition)   // check EOF 
{ 
    fscanf_s    // read from file 
} 
관련 문제