feof

feof

파일 스트림의 끝(EOF)에 도달했는지 확인할 때 써요. 파일을 읽다가 언제 끝났는지 판단해야 할 때 유용해요.

출처: cppreference

본문

문법 (Syntax)

int feof ( FILE * stream );

설명 (Explanation)

주어진 파일 스트림의 끝에 도달했는지 확인해요.

매개변수 (Parameters)

  • stream — 확인할 파일 스트림

반환값 (Return value)

스트림의 끝에 도달했으면 0이 아닌 값, 아니면 0을 반환해요.

참고 (Notes)

이 함수는 가장 최근의 입출력 연산이 보고한 스트림 상태만 알려줘요. 실제 데이터 소스를 들여다보는 게 아니에요. 예를 들어 가장 최근 입출력이 fgetc였는데 그걸로 파일의 마지막 바이트를 읽었다면, feof0을 반환해요. 그 다음 fgetc 호출은 실패하면서 스트림 상태를 파일 끝으로 바꾸고, 그래야 비로소 feof가 0이 아닌 값을 반환해요.

즉 파일 끝 표시기는 '마지막 바이트를 읽은 시점'이 아니라 '그 다음 읽기 시도가 실패한 시점'에 세워진다는 점을 기억하세요.

일반적인 사용에서 입력 스트림 처리는 어느 오류에서든 멈춰요. 그 뒤에 feofferror을 써서 파일 끝으로 끝난 건지, 진짜 오류로 끝난 건지 구분해요.

예시 (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의 자세한 내용을 확인할 수 있어요.