살구월드

잠깐, 리눅스, C 언어, Java, Python 등
각종 예제 검색하기

 

C 관련 포스팅 목록

2020.07.05 - [C] - C/C++ Hex 문자열 바이트 변환 예제

2020.07.03 - [C] - C/C++ 문자열 Hex 값 출력(16진수 변환)

2020.07.03 - [C/stdio] - C/C++ printf 포맷 API 사용 예제(출력) - 1

2020.07.02 - [C] - C/C++ C에서 Split 구현 예제(문자열 자르기 strtok)

2020.07.01 - [C] - C/C++ API 문자열 특정 문자로 나누기(strtok)

 

 

C stdio 라이브러리의 fclose 함수를 이용하여 현재 열린 파일 스트림 닫기

안녕하세요.

 

오늘은 C에서 파일 스트림을 닫는 함수인 fclose에 대해 알아보도록 하겠습니다.

우리가 흔히 텍스트 파일 또는 이미지 파일 등 파일을 작성하기 위해선 fopen 등과 같은 함수를 이용하여 파일 스트림을 사용합니다.

 

파일 스트림은 말 그대로 우리가 작성한 데이터를 포함시킬 버퍼와 같은 역할을 합니다.

C에서 unsigned char[](array), char[](array) 등과 같은 변수 배열은 상수 포인터로서 특정 크기를 가진 메모리 공간을 뜻 합니다.

 

예를 들어 char buf[50]은 char형 변수 크기의 50개가 연속으로 나열된 공간 포인터를 가리키는 변수입니다.

우리는 이 공간을 일반적으로 버퍼라 부르고 버퍼에 데이터를 쓰고 지우고 수정합니다.

 

파일을 작성하기 위해선 fopen 등과 같은 API로 파일 스트림을 열고 이 스트림에 버퍼의 데이터를 입력합니다.

이때 중요한 것은 스트림에 데이터를 입력한다고 해서 파일에 실제 그 데이터가 저장되는 것이 아닙니다.

파일 쓰기는 아래와 같이 순서가 존재합니다.

 

1: 나 이제 "/d/tmp/test.txt" 라는 파일을 작성할 거니깐 파일 스트림 열어줘

2: 파일 스트림에 "안녕하세요 개구리입니다." 라는 문자열을 써 줘

3: 나 이제 파일 스트림에 쓸 내용 다 썼으니깐 파일로 저장해줘

 

파일 스트림에 데이터를 쓰고 반드시 fclose를 수행해야 파일이 정상적으로 저장된다.

 

이와 같이 3번에 해당하는 내용이 바로 fclose 함수의 기능입니다.

스트림에 쓸 내용을 모두 작성했으면 fclose 함수에 해당 스트림을 전달하여 파일로 저장시켜야 합니다. 만약 fclose 미 호출 시 메모리 누수 등 파일 저장에 실패하거나 예기치 못한 상황이 발생할 수 있습니다.

물론 fclose 함수를 쓰기 전에 먼저 파일에 내용을 저장시킬 수도 있습니다.

 

이 내용은 나중에 fflush API 포스팅에서 다루도록 하겠습니다.

이제 예제를 통해 확인해보도록 하겠습니다.

 

 

함수 구조

함수가 포함된 헤더
stdio.h

함수원형
int fclose(FILE *stream)

인자
stream: fopen API로 연 파일 스트림 포인터

반환
0: 파일 닫기 성공
-1(EOF): 파일 닫기 실패

 

 

예제 코드 작성

#include <stdio.h>
#include <string.h>

int main()
{
    const char *text = "안녕하세요. 개구리입니다.";
    FILE *n_fp = fopen("개구리인사법.txt", "w");
    if (!n_fp) {
        printf("파일 생성 실패\n");
        return -1;
    }
    int r = (int)fwrite(text, strlen(text), 1, n_fp);
    if (r < 1) {
        printf("파일 쓰기 실패\n");
        return -1;
    }
    r = fclose(n_fp);
    if (r < 0) {
        printf("파일 닫기 실패\n");
        return -1;
    }
    printf("파일 저장 성공!\n");
    return 0;
}

 

라인 설명

17: 데이터를 쓴 파일 스트림 포인터를 fclose 함수 인자로 전달하여 파일을 저장합니다.

18: fclose 함수에서 반환된 값으로 실패 여부를 예외 처리합니다.

19: 반환 값이 0보다 작을 경우 실패 처리합니다.

 

 

결과

개구리인사법.txt 파일에 내용이 저장된 모습
파일 저장 성공 메시지 출력

위와 같이 fclose 수행 시 파일이 정상적으로 저장된 것을 알 수 있습니다.만약 위 예제에서 fclose 미수행시 데이터가 저장되는 경우도 있지만 파일 저장에 실패할 수도 있고 메모리 누수 등 예기치 못한 상황이 발생할 수 있습니다.

 

따라서 fclose를 반드시 수행해야 합니다.

 

 

마무리

오늘은 파일에 내용을 쓰고 안전하게 저장하는 방법에 대해 알아보았습니다.

그때 사용하는 함수는 fclose이고 fopen, fwrite 등과 같이 사용되는 함수였습니다.

 

 

관련 글

 

C 관련 포스팅 목록

2020.07.05 - [C] - C/C++ Hex 문자열 바이트 변환 예제

2020.07.03 - [C] - C/C++ 문자열 Hex 값 출력(16진수 변환)

2020.07.03 - [C/stdio] - C/C++ printf 포맷 API 사용 예제(출력) - 1

2020.07.02 - [C] - C/C++ C에서 Split 구현 예제(문자열 자르기 strtok)

2020.07.01 - [C] - C/C++ API 문자열 특정 문자로 나누기(strtok)

잠깐, 리눅스, C 언어, Java, Python 등
각종 예제 검색하기

공유하기

facebook twitter kakaoTalk kakaostory naver band