Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

fclose(3)

1장. fclose(3)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 에러
1.5. 예제
1.6. 참고문헌

열린 파일 스트림(stream)을 닫는다.


1.1. 사용법

#include <stdio.h>

int fclose(FILE *stream);
		


1.2. 설명

fclose()함수는 stream으로 연결되어 있는 파일의 스트림 연결을 끊는다. 만약 닫고자 하는 스트림이 출력을 위해 열려져있던 스트림이라면 fflush(3)를 이용해서 버퍼에 있는 데이터를 모두 써야 한다.

참고: 만약 닫혀진 stream에 대해서 fclose()가 다시 한번 실행된다면 어떤일이 일어날지 알 수 없다. 세그멘테이션 오류로 종료할 수도 있고, 그렇지 않고 계속 작동할 수도 있다. 프로그래밍을 할 때는 이점에 주의해야 한다.


1.3. 반환값

성공하면 0을 리턴한다. 실패했을 경우는 EOF를 리턴하고 errno를 설정한다.


1.4. 에러

EBADF

잘못 연결된 stream이다.


1.5. 예제

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

int main(int argc, char **argv)
{
    FILE *fp = NULL;
    char buff[256];

    if ((fp = fopen("flock.c", "r")) == NULL)
    {
        perror("open error");
        exit(1);
    }

    while(fgets(buff, 255, fp))
    {
        printf("%s", buff);
    }

    if (fclose(fp) != 0)
    {
        perror("close error 1");
        exit(0);
    }
    if (fclose(fp) != 0)
    {
        perror("close error 2");
        exit(0);
    }
}
		
위 코드는 fclose()를 두번 호출하고 있다. 아마도 두번째 호출에서 문제가 발생할 것이다. 필자의 리눅스 박스에서는 세그멘테이션 오류가 발생하면서 프로그램이 종료되었다.

위의 문제를 해결하기 위해서 다음과 같은 매크로 함수를 만들었다.

#define Fclose(a) if (a != NULL) \
{\
    fclose(a); \
    a = NULL; \
}
		
위의 함수는 fclose()를 호출하기 전에 우선 스트림이 NULL인지를 확인하고 NULL이라면 이미 닫혀진 스트림으로 가정하고 그냥 넘어간다. 만약 NULL이 아니라면 열려있는 스트림이라고 판단하고 fclose()를 호출한다. fclose()를 호출한 후에 닫혀진 스트림이라는 걸 확인시키기 위해서 스트림이 NULL을 가르키도록 한다.