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: 나 이제 파일 스트림에 쓸 내용 다 썼으니깐 파일로 저장해줘
이와 같이 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보다 작을 경우 실패 처리합니다.
결과
위와 같이 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