c언어/C언어 개념정리

C언어의 표준 입출력 라이브러리 <studio.h> 4. fclose()

코드라니(CODERANY) 2024. 12. 3. 17:31

C 언어의 <stdio.h> 라이브러리는 표준 입출력 기능을 제공하는 함수들을 포함하고 있습니다. 이 라이브러리를 사용하면 콘솔과 파일 간의 데이터 입출력을 손쉽게 처리할 수 있습니다. 

 

다른 입출력 라이브러리보기

더보기
1. printf()

2. scanf()

3. fopen()

4. fclose()

5. fgets()

6. fputs()

7. fprintf()

8. fscanf()

 

1. fclose() 함수의 정의

fclose() 함수는 열린 파일 스트림을 닫고, 해당 스트림에 대한 모든 버퍼를 플러시(쓰기)한 후 메모리에서 해제합니다. 이 함수는 파일 작업이 끝난 후 반드시 호출해야 하며, 이를 통해 데이터 손실을 방지하고 시스템 자원을 효율적으로 관리할 수 있습니다.

 

형식

int fclose(FILE *stream);

stream: 닫을 파일의 포인터입니다. 이 포인터는 fopen()이나 freopen() 함수 호출을 통해 얻은 값입니다.

 

2. 주요 기능

파일 닫기: 열린 파일 스트림을 닫습니다.
버퍼 플러시: 파일에 남아 있는 데이터를 디스크에 기록합니다. 이는 파일이 쓰기 모드로 열렸을 때 중요합니다.
메모리 리소스 해제: 파일 스트림과 관련된 메모리 리소스를 해제합니다.
오류 상태 확인: 파일이 정상적으로 닫혔는지 확인할 수 있습니다.

3. 사용 예제

3.1 기본 사용법

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w"); // 파일을 쓰기 모드로 열기
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fprintf(file, "Hello, World!\n"); // 파일에 데이터 쓰기
    fclose(file); // 파일 닫기
    return 0;
}

위 예제에서 fclose()는 example.txt 파일을 닫고 데이터가 저장되도록 합니다.

 

3.2 오류 처리

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fprintf(file, "Hello, World!\n");

    if (fclose(file) != 0) { // 파일 닫기 시 오류 처리
        perror("Error closing file");
        return 1;
    }

    return 0;
}

파일을 닫을 때 오류가 발생할 수 있으므로, fclose()의 반환 값을 확인하는 것이 중요합니다. fclose()가 성공하면 0을 반환하고, 실패하면 파일 오류가 반환됩니다.

 

4. 성능 고려사항

4.1 버퍼 플러시
fclose()는 파일에 남아 있는 데이터를 디스크에 기록합니다. 이는 파일이 쓰기 모드로 열렸을 때 중요합니다. 따라서, 파일을 닫기 전에 모든 데이터를 플러시하는 것이 좋습니다. 이 작업은 일반적으로 자동으로 이루어지지만, 수동으로 fflush()를 호출하여 파일 스트림의 버퍼를 직접 플러시할 수도 있습니다.

플러시* :  메모리 버퍼에 있는 데이터를 실제 저장 장치(예: 디스크)에 기록하는 과정

#include <stdio.h>

int main() {
    FILE *file = fopen("output.txt", "w");
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    fprintf(file, "Writing some data...\n");
    fflush(file); // 버퍼를 플러시
    fclose(file); // 파일 닫기
    return 0;
}

 

4.2 파일 핸들 관리
여러 파일을 동시에 열 때는 각 파일에 대한 포인터를 잘 관리해야 합니다. fclose()를 호출하여 파일을 닫지 않으면 메모리 누수가 발생할 수 있습니다. 파일 포인터를 배열에 저장하여 관리하는 방법도 있습니다.

#include <stdio.h>

#define MAX_FILES 10

int main() {
    FILE *files[MAX_FILES];
    for (int i = 0; i < MAX_FILES; i++) {
        char filename[20];
        sprintf(filename, "file%d.txt", i);
        files[i] = fopen(filename, "w");
        if (files[i] == NULL) {
            perror("Error opening file");
            return 1;
        }
        fprintf(files[i], "This is file number %d\n", i);
    }

    for (int i = 0; i < MAX_FILES; i++) {
        fclose(files[i]); // 모든 파일 닫기
    }

    return 0;
}