fclose
fclose
연 파일 스트림을 닫을 때 써요. 파일 작업이 끝나면 반드시 열었던 스트림을 닫아야 해요. 열었는데 안 닫으면 자원이 계속 잡혀 있거든요.
출처: cppreference
본문
문법 (Syntax)
int fclose ( FILE * stream );
설명 (Explanation)
주어진 파일 스트림을 닫아요. 아직 쓰지 않고 버퍼에 남아 있던 데이터는 운영체제로 모두 플러시(flush)돼요. 반대로 아직 읽지 않고 버퍼에 남아 있던 데이터는 버려져요.
동작이 성공하든 실패하든, 스트림은 더 이상 파일과 연결되지 않아요. 그리고 setbuf나 setvbuf가 할당한 버퍼가 있다면 그것도 스트림에서 분리되고, 자동 할당이었다면 해제돼요.
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과 함께 보면 파일 입출력의 시작과 끝이 이어져요.
- 닫힌 뒤 스트림 상태를 확인하는 feof와 ferror 문서도 참고하면 좋아요.
- cppreference 원문에서
fclose의 자세한 내용을 확인할 수 있어요.