fclose(3)

#include <stdio.h>

int fclose(FILE *fp);

fopen(3), fdopen(3) 등으로 open한 stream (FILE *)을 close합니다. fclose(3)는 메모리에 buffering된 쓰기 지연된 데이터를 fflush(3)를 호출하여 write하고 stream을 닫습니다. open된 stream을 모두 닫지 않고 프로그램을 정상적으로 종료하게 되면 다음과 방식으로 file을 close합니다. 만약 프로그램에서 exit(3)함수를 호출하여 프로그램을 종료하게 되면, open된 채로 남겨진 FILE *를 exit(3)가 모두 close합니다. main()함수의 return에 의해서 정상 종료를 한다면 main()함수가 내부적으로 exit(3)함수를 호출해줍니다.

 

만약, 비정상적으로 프로그램이 종료를 한다면, 예를들어 kill -9 ... 한다면 열려진 파일을 정상적으로 fclose(3)하지 못하여 buffer에 저장된 데이터는 파일에 저장되지 않고 끝나버립니다. 그렇지만 OS에 의해서 close(2)로 fd는 닫아서 파일은 정상적으로 close됩니다. 

 

 

파라미터

fp
    - fopen(3), fdopen(3)으로 open한 stream

 

RETURN

-1이 아님
    - 정상적으로 fp가 close되었습니다.

-1
    - 오류가 발생하였으며, 상세한 오류는 errno에 저장됩니다. 
    EBADF : fp에 내에서 관리하고 있는 fd(file descriptor)가 유효하지 않습니다.
    이 외에 close(2), write(2) 등의 함수에서 발생하는 오류가 발생할 수 있습니다.
    
    fclose(3)는 내부적으로 buffering하고 있는 데이터를 write하고, close하기 때문에 
    이들 함수에서 오류가 발생하면 fclose(3)에서도 errno로 설정됩니다.

 

 


활용 예제

 

Sample : 파일을 복사하는 프로그램

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

int main(int argc, char *argv[])
{
    FILE *wfp, *rfp;
    char buffer[4096];
    int  size;
    char sfile[1024];
    char dfile[1024];

    ......

    if(argc != 3) {
        fprintf(stderr, "Usage:\n\t%s src_file dest_file\n\t파일을 복제합니다.\n", argv[0]);
        return 1;
    }

    strcpy(sfile, argv[1]);
    strcpy(dfile, argv[2]);

    if((rfp = fopen(sfile, "r")) == NULL) {
        fprintf(stderr, "%s file open error: %s\n", sfile, strerror(errrno));
        return 1;
    }

    if((rfp = fopen(dfile, "w")) == NULL) {
        fprintf(stderr, "%s file open error: %s\n", dfile, strerror(errrno));
        return 1;
    }
    
    while((size = fread(buffer, 1, 4096, rfp)) > 0) {
        fwrite(buffer, 1, size, wfp);
    }

    fclose(rfp);
    fclose(wfp);

    return 0;
}

 


see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요