EOF와 feof
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은 실행되지 않고 루프를 탈출한다.