C 언어

EOF와 feof

zeroup 2022. 7. 27. 15:42

feof(FILE* fstream) : 파일의 끝에 도달했을 때 0이외의 값을 반환.

이로 인해 잘못된 예제가 자주 발생하는데,

while(!feof(fp))

{

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

printf("%s", str);

}

==================== [file.txt] ====================

aaa

bbb

ccc

===============================================

===================== [결과] =====================

aaa

bbb

ccc

(null)

===============================================

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

그렇기에 실제 파일의 구조는 아래와 같다.

================== [실제 file.txt] ===================

aaa

bbb

ccc

[EOF]

===============================================

그리고,

> feof(FILE* fstream) : 파일의 끝에 도달했을 때 0이외의 값을 반환.

에서 파일의 끝은 EOF가 아닌, 정말 데이터가 존재하지 않는 끝을 의미

즉, feof를 사용하여 파일의 끝을 체크할 시, EOF까지 출력 후 루프가 종료된다.

[개선안]

while(1)

{

/* 파일 읽기 */

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

if(feof(fp)) break;

/* 동작 부분 */

printf("%s", str);

}

이러면 마지막 텍스트를 읽고난뒤 fp는 EOF를 가리킬테니 루프를 탈출하지않고 아래 동작부분이 정상적으로 수행될 것이고,

다음 루프에서 EOF를 읽고 fp가 파일의 끝을 가리킬테니 EOF를 읽은 str은 실행되지 않고 루프를 탈출한다.

출처 : https://huammmm1.tistory.com/8