모든 파일의 끝에는 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를 반환하게 된다...



'C > 공개글' 카테고리의 다른 글

gets와 fgets  (0) 2013.01.23
데이터를 정렬할 때 유의사항  (0) 2013.01.23
printf와 puts와 fputs  (0) 2013.01.23
printf의 서식  (0) 2013.01.23
key sum  (0) 2013.01.23
Posted by huammmm1
,