본문 바로가기

공부/c언어

feof()함수

반응형

feof()함수

 

파일에 저장된 내용

아나다라마

 

실제로 파일에 저장되어있는 내용

아나다라마(eof)

 

실제 파일을 열어서 눈으로 봤을 때는 마지막에 eof(=-1)가 보이지는 않음

 

위의 파일에서 "아나다"를 읽었다면 파일포인터는 '라'를 가리키게 됨

 

반환값:

파일의 마지막(eof)을 넘어서 feof함수를 호출하면 0이 아닌 값을 반환

위에서 파일의 마지막은 'eof'이다

마지막을 넘었다는 것은 'eof'보다 뒤에 파일 포인터가 위치해있다는 것이다

 

파일의 마지막(eof) or 그 이전에는 feof함수를 호출하면 0을 반환

Return Value

The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.

 

----------------------------------------------------------------------------------------------

 

feof 사용 예제

fread(%score, sizeof(score), 1, f);

 

while(!feof(f))

{

printf("%6d%18s%8d%8d%8d\n", score.number, score.name, score.mid, score.final, score.quiz);

fread(&score, sizeof(pscore), 1, f);

}

 

1. 파일에서 이전에 읽었던 내용을 화면에 나타냄

2. 현재 파일포인터에서 파일을 내용을 읽음 

 

계속 반복하다가 파일의 eof에 도달하면

1. eof이전까지 읽어들인 내용을 화면을 나타냄

2. eof부터 파일의 내용을 읽으려고 하지만 내용이 없으므로 읽기를 실패함

 

이제 파일의 eof를 넘어섰으므로 feof(f)는 1이 되고 while문을 빠져나오게 됨

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

참조 : http://huammmm1.tistory.com/8

모든 파일의 끝에는 EOF(-1)값이 있고, 이 값도 엄연하게 파일의 한 부분이다.


한편 feof 함수의 설명에는 '파일의 끝에 도달하면 nonzero를 반환 하고, 파일의 끝이


아니면 0을 반환한다' 라고 나와있다.


여기서 말하는 파일의 끝은 EOF를 의미하는 것이 아니다...


어떤 한 텍스트파일에다가 어떤 값을 저장해 놓고서


fseek(fp, 0, SEEK_END);

feof(fp);


fseek을 이용해 파일 위치 지시자를 EOF에 위치시켜 놓고


feof가 반환하는 값을 보면 0을 반환한다


즉 feof는 EOF를 만나도 0을 반환한다.


결국 feof는 EOF를 넘어서게 될 때 true를 반환한다...



-------------------------------------------------------




#include <stdio.h>

int main (void)

{

FILE * fp = fopen("fds.txt", "rt");

char str[100];

while(!feof(fp))

{

fgets(str, sizeof(str), fp);

printf("%s", str);

}

fclose(fp);

return 0;

}









(텍스트파일에는 '1엔터2엔터'가 저장되어 있다.)


내가 이상하게 생각했던 것은 위의 소스코드가 while문을 3번이나 돈다는 것이었다.


당시의 나의 생각은


1번째 반복에서 1\n 을 읽고 -> (파일 위치 지시자가 2 가리키는 상태)


2번째 반복에서 2\n 을 읽고 -> (파일 위치 지시자가 EOF 가리키는 상태)


3번째 반복문의 조건에서 EOF를 만났으므로 !feof가 false가 되어 반복문을 빠져나간다


라고 생각했었다.


하지만 실제 결과는 while문을 3번 돌고 4번째의 while조건을 만나서 반복문을 빠져나갔다.


왜그럴까?


3번째 반복문의 조건에서 EOF를 만났으므로 feof는 0을 반환한다.


그리고 반복문 내부에서 fgets가 문자열을 입력받는데, 파일 지시자는 EOF를 가리키고있다.


따라서 fgets는 EOF를 만나서 NULL을 반환하고, 파일 지시자는 EOF를 넘어서게 된다.


따라서 4번째 반복문의 조건에서 feof는 true를 반환하게 된다...


반응형