feof
feof
파일 스트림의 끝(EOF)에 도달했는지 확인할 때 써요. 파일을 읽다가 언제 끝났는지 판단해야 할 때 유용해요.
출처: cppreference
본문
문법 (Syntax)
int feof ( FILE * stream );
설명 (Explanation)
주어진 파일 스트림의 끝에 도달했는지 확인해요.
매개변수 (Parameters)
- stream — 확인할 파일 스트림
반환값 (Return value)
스트림의 끝에 도달했으면 0이 아닌 값, 아니면 0을 반환해요.
참고 (Notes)
이 함수는 가장 최근의 입출력 연산이 보고한 스트림 상태만 알려줘요. 실제 데이터 소스를 들여다보는 게 아니에요. 예를 들어 가장 최근 입출력이 fgetc였는데 그걸로 파일의 마지막 바이트를 읽었다면, feof는 0을 반환해요. 그 다음 fgetc 호출은 실패하면서 스트림 상태를 파일 끝으로 바꾸고, 그래야 비로소 feof가 0이 아닌 값을 반환해요.
즉 파일 끝 표시기는 '마지막 바이트를 읽은 시점'이 아니라 '그 다음 읽기 시도가 실패한 시점'에 세워진다는 점을 기억하세요.
일반적인 사용에서 입력 스트림 처리는 어느 오류에서든 멈춰요. 그 뒤에 feof와 ferror을 써서 파일 끝으로 끝난 건지, 진짜 오류로 끝난 건지 구분해요.
예시 (Example)
파일을 끝까지 읽고 나서 ferror로 오류인지, feof로 정상 종료인지를 가려내는 흔한 패턴이에요.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL);
int is_ok = EXIT_FAILURE;
FILE* fp = fopen(fname, "w+");
if (!fp)
{
perror("File opening failed");
return is_ok;
}
fputs("Hello, world!\n", fp);
rewind(fp);
int c; // note: int, not char, required to handle EOF
while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop
putchar(c);
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
{
puts("End of file is reached successfully");
is_ok = EXIT_SUCCESS;
}
fclose(fp);
remove(fname);
return is_ok;
}
가능한 출력 (Possible output):
Hello, world!
End of file is reached successfully
참고 문헌 (References)
- C11 표준 (ISO/IEC 9899:2011): 7.21.10.2 The feof function (p: 339)
- C99 표준 (ISO/IEC 9899:1999): 7.19.10.2 The feof function (p: 305)
- C89/C90 표준 (ISO/IEC 9899:1990): 4.9.10.2 The feof function
더 알아보기
- 실제 오류인지 확인하려면 ferror을 보세요. 둘을 함께 써야 정확한 판단이 돼요.
- 오류 상태를 지우려면 clearerr을 쓰세요.
- cppreference 원문에서
feof의 자세한 내용을 확인할 수 있어요.