반응형

fopen(3)

#include <stdio.h>

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

파일을 읽기 또는 쓰기를 위하여 파일을 open합니다.  open(2)함수와는 달리 fopen(3)은 파일 I/O를 할 때에 바로 바로 kernel I/O를 하는 것이 아니라 사용자 영역 메모리에서 데이터를 buffering하고 있다가 buffer가 찼을 때에 kernel I/O를 발생하여 시스템의 부하를 줄일 수 있습니다. fflush(3)나 fclose(3)시에는 buffer에 있는 데이터를 강제로 File에 I/O가 발생합니다.

 

open(2) 함수와 fopen(3)함수는 장단점이 있지만 특이한 경우가 아니면 fopen(3) 함수를 이용하는 것이 바람직합니다. open(2) 함수로 open된 파일은 write(2)함수를 호출하여 file에 write할 때에 1바이트라 쓰기를 하든 1000 바이트를 쓰든 1회의 disk I/O를 발생시킵니다. disk의 I/O는 OS와 통신하는 kernel mode로 전환되어 시스템의 부하를 발생시킵니다. 예를들어 open(2) 파일을 open 후 1바이트씩 4000 번 write를 하면 kenel I/O가 4000번 발생합니다. 그러나 fopen(3)함수로 file을 open하여 fwrite / fprintf  등으로 파일을 1바이트씩 write하면 1회의 DISK I/O가 발생합니다. 이 처럼 시스템에 부하를 많이 줄여줄 수 있습니다.

 

파라미터

path
    - 파일을 open할 파일명에 대한 상대 path 또는 절대 path
mode
    - 왜 파일을 open하는 지에 대한 정보를 설정합니다.

 "r" : 파일을 읽기 전용으로 open하며 파일의 시작 위치부터 읽을 준비를 합니다.
       path에 지정된 파일이 실제로 없으면 오류가 발생합니다.

 "r+" : 파일을 읽기 / 쓰기용으로 open합니다. 파일의 내용은 지우지 않습니다.
       파일의 시작위치에서 읽거나 쓸 수 있습니다.
       path에 지정된 파일이 실제로 없으면 오류가 발생합니다.

 "w" : 파일을 쓰기 전용으로 open합니다.
       path에 지정된 파일이 실제로 없는 파일이면 (0666 & ~umask)파일 접근 권한으로 파일을 생성합니다.
       path에 지정된 파일이 실제로 존재하는 파일이면 내용을 전체 삭제합니다.

 "w+" : 파일을 읽기 / 쓰기용으로 open합니다. 
       path에 지정된 파일이 실제로 없는 파일이면 (0666 & ~umask)파일 접근 권한으로 파일을 생성합니다.
       path에 지정된 파일이 실제로 존재하는 파일이면 내용을 전체 삭제합니다.

 "a" : 파일을 append mode로 open합니다. open시 파일의 내용은 삭제되지 않습니다.
       파일의 중간에 쓰기를 할 수 없으며, 쓰기를 하면 자동으로 파일의 끝으로 이동 후에 쓰기를 합니다.
       여러개의 프로세스가 write를 해도 겹쳐쓰기 없이 append됩니다.
       path가 없는 파일이면 (0666 & ~umask)파일 접근 권한으로 파일을 생성합니다.

 "a+" : 파일을 append 및 읽기 mode로 open합니다. open시 파일의 내용은 삭제되지 않습니다.
       파일의 중간에 쓰기를 할 수 없으며, 쓰기를 하면 자동으로 파일의 끝으로 이동 후에 쓰기를 합니다.
       여러개의 프로세스가 write를 해도 겹쳐쓰기 없이 append됩니다.
       path가 없는 파일이면 (0666 & ~umask)파일 접근 권한으로 파일을 생성합니다.
       만약, 쓰기를 한번이라도 하고 나면 파일의 acess 위치가 끝으로 이동합니다.
       따라서 파일을 읽을 때에는 읽을 위치를 fseek(3)으로 이동 후에 읽도록 합니다.

 위의 모드에 b를 붙여 사용하는 것은 MS-DOS나 MS-Windows에서 사용하는 것으로 LINUX/UNIX에서는 무시됩니다. 
 MS-DOS나 MS-Windows에서 b를 붙이지 않으면 (예, "rb", "wb" ...)  \n를 쓰면 \r\n를 쓴 것과 같이 2바이트가 write됩니다. 
 MS-OS/MS-Windows의 new line은 \r\n이며 UNIX/LINUX의 new line은 \n이기 때문에 차이가 있습니다. 
 즉, MS-Windows에서는 text모드와 binary 모드가 있으나 UNIX/LINUX는 binary 모드만 있습니다.

 

 

RETURN

NULL 아님
    - 정상적으로 파일이 open되었습니다.
    
NULL
    - 오류가 발생하였으며, 오류 내용은 errno에 설정됩니다.
      EINVAL : mode값이 잘못 설정됨

 

 


활용 예제

 

Sample

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    char buffer[4096];

    ......

    if((fp = fopen("myprogram.log", "a")) == NULL) {
        fprintf(stderr, "log file 생성 오류: %s\n", strerror(errno));
        return 1;
    }

    ......

    fprintf(fp, "%s - %s - %05d : 데이터는 %s\n", __FILE__, __func__, __LINE__, data);

    ......

    fclose(fp);

    return 0;    
}

 

 


see also: File / Directory 처리 관련 API

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,