C 관련 포스팅 목록
2021.11.30 - [C/stdio] - C 파일 스트림 닫기(stdio/fclose)
2020.07.03 - [C/stdio] - C/C++ printf 포맷 API 사용 예제(출력) - 1
2020.07.05 - [C] - C/C++ Hex 문자열 바이트 변환 예제
2020.07.03 - [C] - C/C++ 문자열 Hex 값 출력(16진수 변환)
2020.07.02 - [C] - C/C++ C에서 Split 구현 예제(문자열 자르기 strtok)
2020.07.01 - [C] - C/C++ API 문자열 특정 문자로 나누기(strtok)
C stdio 라이브러리의 fopen함수를 이용하여 새로운 파일 만들기
안녕하세요.
오늘은 이전 포스팅에서 다뤘던 C fclose 함수 사용방법에 이어 파일 생성 또는 열기에 사용되는 fopen 함수에 대해 알아보도록 하겠습니다.
fopen 함수는 이미 만들어진 파일 데이터를 읽기 위해 파일을 열 때나 아니면 새로운 파일을 생성하기 위해 사용합니다. 새로운 파일이라 함은 기억장치(ssd, 하드디스크 등)에 파일 I/O 를 통해 데이터를 저장하는 단위입니다.
물론 세부 단위를 표현한다면 너무 내용이 길어지기 때문에 간단히 하겠습니다.
파일을 생성하거나 열기 위해서는 아래와 같은 조건이 필요합니다.
1: 파일을 생성하거나 열 파일의 이름과 위치한 경로
2: 파일을 열 때 어떻게 열 것인가? (파일 내용을 읽기만 한다, 파일에 내용을 쓰기만 한다, 기존 파일 내용 뒤에 내용을 추가한다) 등
표준 정의에서 위의 2번을 모드(mode)라고 말합니다.
위의 "개구리 인사법 안내" 는 fclose 포스팅에서 다뤘던 텍스트 파일의 내용입니다.
위의 모드는 각각 r, w, a 모드 3개를 설명하고 있으나 이외 r+, w+, a+ 등의 모드가 있습니다.
이 모드들은 다음 포스팅에서 추가로 다루도록 하겠습니다.
함수 구조
함수가 포함된 헤더
stdio.h
함수원형
FILE *fopen(const char *filename, const char *mode)
인자
filename: 새로 생성하거나 열 파일의 경로
mode: 파일 열기 모드 문자(r, w, a 등)
반환
0 이상: 생성된 파일 스트림 포인터(사실상 0, 1, 2 등 이미 예약된 파일 스트림 포인터는 사용 반환되지 않는다)
이외: 파일 열기 실패
예제 코드 작성
#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;
}
라인 설명
7: 새로운 파일을 생성하거나 기존 파일을 열기 위해 fopen 인자에 경로명과 모드를 인자로 전달합니다. 예제에서는 'w' 모드이기 때문에 새로운 파일을 생성하여 데이터를 씁니다. 만약 동일한 경로명에 파일이 존재한다면 기존 파일 내용을 지우고 새로운 데이터를 저장하는 모드입니다.
8: 만약 fopen 호출 결과가 0인 경우 파일 열기 실패로서 예외 처리합니다.
9: 파일 생성에 실패하여 프로그램을 종료합니다.
결과
만약 r 모드로 파일을 열기 위해서는 반드시 fopen에 인자로 전달한 경로명에 파일이 존재한 상태여야 합니다. 존재하지 않을 경우 에러(0)를 반환합니다.
마무리
오늘은 C에서 새로운 파일을 생성하거나 기존 파일을 여는 fopen 함수에 대해 알아보았습니다.
fopen 함수에 전달되는 인자인 모드는 r, w, a 등이 있고 r은 반드시 기존 경로에 파일이 존재해야 하지만 w는 기존 경로에 파일이 없다면 새로 생성한다는 차이점이 있었습니다.
a 모드는 w모드의 특징을 가져가지만 다른 부분은 기존에 파일이 존재했다면 마지막에 데이터를 추가한다는 점이었습니다.
이전 fclose 포스팅을 참고하시면 더 이해하기 쉽습니다.
관련 글
C 관련 포스팅 목록
2021.11.30 - [C/stdio] - C 파일 스트림 닫기(stdio/fclose)
2020.07.03 - [C/stdio] - C/C++ printf 포맷 API 사용 예제(출력) - 1
2020.07.05 - [C] - C/C++ Hex 문자열 바이트 변환 예제
2020.07.03 - [C] - C/C++ 문자열 Hex 값 출력(16진수 변환)