표준 입출력 라이브러리에서는 작업할 파일을 열 때 fopen 함수를 사용합니다. 정상적으로 파일을 열면 작업할 파일 스트림 정보를 기억하는 FILE 구조체 포인터를 반환하며 실패하면 NULL을 반환합니다. 이 후에 모든 표준 입출력 라이브러리를 사용할 때 fopen 함수에서 반환한 파일 스트림을 인자로 사용합니다. 모든 작업을 완료하여 더 이상 파일 스트림을 사용하지 않는다면 fclose 함수를 호출하여 파일 스트림을 닫습니다.
#include <stdio.h >
FILE *fopen(const char *pathname, const char *mode);
반환 값: 실패 시 NULL
mode:
“r” 읽기 모드
“w” 쓰기 모드
“a” 추가 모드
“t” 텍스트 파일 모드
“b” 바이너리 파일 모드
“+” 읽기/쓰기 모두 가능
*모드에서 r, w, a중 하나는 필수적으로 명시하여야 한다. #include <stdio.h >
int fclose(FILE *fp);
반환 값: 실패 시 EOF(-1), 성공하면 0
fopen 함수를 호출하여 파일 열기를 성공하면 작업에 필요한 파일 디스크립터외에 효과적인 입출력을 위한 버퍼를 부여하고 현재 작업 모드 등을 설정한 파일 스트림을 반환합니다.
fopen 함수의 두 번째 인자에 “w” 혹은 “a”로 열었을 때에는 첫 번째 인자로 전달한 파일이 없을 때 새로 생성합니다. 하지만 “r” 로 열었을 때는 파일이 없으면 NULL을 반환합니다.
다음은 main 함수 인자로 파일 이름과 모드를 입력받아 fopen 함수에 인자로 전달하는 예제입니다. 이를 통해 존재하지 않는 파일과 접근 모드(“w”, “a”, “r”)를 입력하여 확인해 보세요.
/********************************************************************** * ex_fopen.c * * exmple source – test fopen * **********************************************************************/ #include <stdio.h> int main(int argc, char **argv) { if(argc != 3) { fprintf(stderr, "Usage:%s <new file> <mode>\n",argv[0]); fprintf(stderr, "mode is r or w or a \n"); return 1; } FILE *fp = fopen(argv[1],argv[2]); if(fp) { printf("succeed\n"); fclose(fp); } else { printf("failed\n"); } return 0; }
실행 화면을 보는 것처럼 쓰기 모드(“w”)와 추가 모드(“a”)로 파일을 열었을 때 파일이 없으면 새로 생성하는 것을 알 수 있습니다. 하지만 읽기 모드(“r”)에서는 NULL(0, 거짓)을 반환함을 알 수 있어요.
파일이 있을 때에는 쓰기 모드(“w”)로 열면 기존 파일의 내용은 지워집니다. 다음 실행 화면을 보면 이를 테스트 한 결과를 확인할 수 있어요.