fclose

fclose

연 파일 스트림을 닫을 때 써요. 파일 작업이 끝나면 반드시 열었던 스트림을 닫아야 해요. 열었는데 안 닫으면 자원이 계속 잡혀 있거든요.

출처: cppreference

본문

문법 (Syntax)

int fclose ( FILE * stream );

설명 (Explanation)

주어진 파일 스트림을 닫아요. 아직 쓰지 않고 버퍼에 남아 있던 데이터는 운영체제로 모두 플러시(flush)돼요. 반대로 아직 읽지 않고 버퍼에 남아 있던 데이터는 버려져요.

동작이 성공하든 실패하든, 스트림은 더 이상 파일과 연결되지 않아요. 그리고 setbufsetvbuf가 할당한 버퍼가 있다면 그것도 스트림에서 분리되고, 자동 할당이었다면 해제돼요.

fclose가 반환한 뒤에 stream 포인터의 값을 사용하면 동작이 정의되지 않아요. 닫힌 스트림 포인터는 더 이상 쓰면 안 된다는 뜻이에요.

매개변수 (Parameters)

  • stream — 닫을 파일 스트림

반환값 (Return value)

성공하면 0, 실패하면 EOF를 반환해요.

예시 (Example)

파일을 쓰고 읽는 전체 과정을 보여줘요. 마지막에 fclose(fp)로 스트림을 닫고, 임시 파일도 remove로 삭제해요.

#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)

  • C23 표준 (ISO/IEC 9899:2024): 7.21.5.1 The fclose function (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018): 7.21.5.1 The fclose function (p: TBD)
  • C11 표준 (ISO/IEC 9899:2011): 7.21.5.1 The fclose function (p: 304)
  • C99 표준 (ISO/IEC 9899:1999): 7.19.5.1 The fclose function (p: 270)
  • C89/C90 표준 (ISO/IEC 9899:1990): 4.9.5.1 The fclose function

더 알아보기

  • 파일을 여는 fopen과 함께 보면 파일 입출력의 시작과 끝이 이어져요.
  • 닫힌 뒤 스트림 상태를 확인하는 feofferror 문서도 참고하면 좋아요.
  • cppreference 원문에서 fclose의 자세한 내용을 확인할 수 있어요.