fopen() 이나 fclose() 로 파일을 열고 닫을때, 꼭 등장하는 녀석이 바로 FILE 형 포인터 일 것이다. 대문자로 쓴것에서도 냄새가 물씬 풍기듯이 keyword 가 아니고, stdio.h 에 정의되어있는 구조체이다. 구조체는 데이터형을 묶어놓은 패키지로 대상의 속성에 맞게 세팅해서 사용하는 것이라고 할 수 있겠다. 구조체는 나중에 살펴보도록 하고...

FILE 은 stdio.h 에 정의되어 있는데, 기본적으로 machine dependent 이다.

struct _iobuf {
              char *_ptr ;
              int    _cnt ;
              char *_base;
              int    _flag;
              int    _file;
              int    _charbuf;
              int    _bufsiz;
              char *_tmpfname;
};

typedef struct _iobuf FILE;

위의 상황에서는 FILE은 typedef 로 이름만 다시 붙인것이므로, FILE 대신 struct _iobuf  을 써도 똑같지만, 기본적으로 machine dependent 하고, typedef 가 machine dependency 를 다소 해결하는데 도움을 주므로, 그냥 FILE 을 쓰는것이 좋다.

fopen() 함수는 stdio.h 에 정의되어 있으며, 프로토타입은 다음과 같다.

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

즉, 두개의 문자열 상수를 받고, FILE 형 포인터를 리턴한다.

첫번째 인자는 대상 파일명 이고, 두번째 인자는 open mode 이다.

open mode 는 읽기(r) , 쓰기(w) , 첨부(a) 의 세가지 기본적인 모드가 있다.


기본3가지 모드에 대해서 살펴보면...

"r"  read
 파일이 있으면 열고 없거나 접근할 수 없으면 NULL 포인터를 리턴한다.

"w" write
파일이 있거나 말거나 걍 새로 쓴다. 즉, 있으면 지워버리고 새로 쓴다. 역시 접근할수 없으면 NULL 포인터를 리턴한다.

"a"  append
파일뒤에 덧붙여 쓰는 모드이다. 없으면 새로 쓰고, 있으면 덧붙여 쓴다. 접근할수 없으면 NULL 포인터를 리턴한다.


이진처리 옵션은 b 이다.
"rb"           read binary
"wb"          write binary
"ab"           append binary


또다른 옵션으로 + 이 있다. 이것에 대해서는 생략한다.

파일은 동시에 여러개를 열어놓을수 있다. 가령 어떤 파일을 열어서, 다른파일 하나를 더 연다음 뒤에 덧붙여 쓰거나 할 수 있다. 이때는 두개의 파일을 연것이다.

파일처리가 끝나면 파일을 닫아준다. 물고있는 파일을 놓는것이다. 물론, 대부분의 컴파일러는 프로그램이 종료되면 자동으로 처리중인 파일을 닫아주지만, 그래도 확실하게 닫아주는것이 좋다.

이때 사용되는 함수가 fclose() 이다. 프로토 타입은 다음과 같다.
int  fclose( FILE* );

인자는 닫고자 하는 파일을 가리키는 파일포인터이다.
리턴값은 성공적으로 닫았을경우 0 을 리턴하고, 에러 발생시 EOF 를 반환한다.
참고로 EOF 는 end of file 을 의미하고, int 값으로 -1 이다.


예.
#include<stdio.h>

void main(void)
{
     FILE *fp;
        /*  FILE 대신 struct _iobuf 를 써도 똑같이 돌아간다. */
 
     fp = fopen("test.txt","w");       /*   쓰기모드로 열고, 파일포인터가 test.txt 를 가리키도록...   */

     fprintf(fp,"Hello!");                 /*   test.txt 에 Hello! 를 기록한다. */

     fclose(fp);      /*  fclose() 가 인자로 파일포인터를 갖는데 반해, _fcloseall() 은 인자가없다.*/

     return;
}

컴파일후 실행해보면, test.txt 파일을 생성한다. 그 파일을 열어보면, Hello! 라고 기록이 되어있는 것을 확인할 수 있다.