C언어 - 파일 입출력(3)   파일의 열기와 닫기

 

프로그램이 파일과 데이터를 교환하기 위해서는 먼저 파일을 열어야 한다. 파일을 열 때는 프로그램이 운영체제에 접속할 파일과 파일에 수행할 연산을 일러준다.

 

이때 운영체제는 프로그램과 파일 사이의 통신을 위한 환경을 설정해 준다. C언어 에서는 이러한 환경의 일부로서 C 구조체를 이용한다. 이 구조체를 통하여 프로그램은 파일과 통신한다. 이구조체의 원형은 <stdio.h> 파일에 FILE 형으로 정의 되어 있으며, 파일의 크기나 파일이 사용하는 데이터 버퍼의 위치 등의 정보를 가지고 있다.

 

프로그램이 특정한 파일을 열었을 때 운영체제는 이 파일을 위한 구조체를 생성하고, 이 구조체에 대한 포인터를 프로그램에게 돌려준다. 이후 프로그램은 이 포인터를 통해서 파일과 통신하다. 파일의 구조체를 가리키는 포인터 변수를 다음과 같이 선언한다.

 

FILE *fpointer

 

파일을 열기 위해서는 fopen() 함수를 다음과 같이 호출한다.

 

fpointer = fopen("test.dat","w");

 

이 명령문이 실행되면, 운영체제는 "test.dat" 라는 파일을 열고 파일에 대한 구조체를 생성하여, 구조체를 가리키는 포인터를 호출 프로그램에게 돌려준다. 이후 "test.dat"파일은 파일 포인터 변수 fpointer를 이용하여 접근한다. fopen()함수의 두 번째인수 "w"는 이 파일에 데이터를 기록하겠다는 의미이다. 이것을 모드라 부르는데, 다음과 같은 모드가 있다

파일 열기 모드

 

모드 의미
r 읽기위해서 텍스트모드로 파일을 연다
w 쓰기위해서 텍스트모드로 파일을 연다
a 텍스트 모드로 기존의 파일에 추가한다.
rb 읽기위해서 2진모드로 파일을 연다.
wb 쓰기위해서 2진모드로 파일을 연다.
ab 2진 모드로 기존의 파일에 추가한다.
r+ 읽기와 쓰기를 위해서 텍스트 모드로 파일을 연다.
w+

읽기와 쓰기를 위해서 텍스트 모드로 파일을 생성한다.

a+

읽기와 추가를 위해서 텍스트 모드로 파일을 연다. 파일이 존재하지 않으면 생성한다.

r+b

읽기와 쓰기를 위해 2진 모드로 파일을 연다

w+b 읽기와 쓰기를 위해서 2진모드로 파일을 생성한다.
a+b 읽기와 추가를 위해서 2진 모드로 파일을 연다. 파일이 존재하지 않으면 추가로 생성한다.

 

 

읽기 모드로 파일을 열었을 경우 파일이 존재하지 않으면 fopen() 함수는 실패하고, 함수는 NULL 값을 돌려준다. 쓰기 모드로 열었을 경우 파일이 존재하지 않으면 새로 생성하고, 파일이 존재할 경우 기존 내용을 모두 지우고 새로운 파일을 생성하므로 쓰기 모드로 파일을 열 때에는 특히 조심해야 한다. 추가 모드로 열었을 경우 파일이 존재하지 않으면 파일을 생성하고, 파일이 존재하면 기존의 파일의 끝에 새로운 데이터를 기록할 수 있다. r+와 w+모드의 차이점은 파일이 존재하지 않을 경우 생성하나 r+는 파일을 생성하지 않는다. 파일이 존재할 경우 w+는 기존의 내용을 지우지만, r+는 기존의 내용을 지우지 않는다.

 

파일 사용이 끝났을때

  

파일의 사용이 끝났을 때 파일과의 통신을 종료하기 위해서는 다음의 fclose() 함수를 호출한다.

 

fclose(fpointer);

 

파일을 닫으면, 운영체제는 버퍼내에 남아 있는 데이터를 디스크에 기록하고, 파일을 위해서 할당했던 구조체와 버퍼를 해제하여 메모리를 시스템에 돌려준다. 만약에 프로그램 종료시 파일을 닫지 않았을 경우에는 버퍼내의 데이터가 디스크에 기록되지 않아 파일의 내용이 프로그램의 결과와 일치하지 않을 수 있다. 따라서 프로그램이 종료되기 전에 파일을 꼭 닫아 주어야 한다. fopen()과 fclose()함수의 원형은 다음과 같다.

 

FILE *fopen(const char *filename, const char *mode);

int fclose (FILE *fp);

 

fopen() 함수는 실패한 경우 NULL  값을 리턴하고, fclose()함수는 성공할 경우 실패할 경우 EOF를 리턴한다.