[리눅스 시스템 프로그래밍] 5.6 freopen, fdopen

표준 입출력 라이브러리에서는 fopen 외에도 freopen, fdopen 함수를 통해 파일 스트림을 열 수 있어요. 이 두 함수는 이미 열려진 파일을 재지정할 때 사용합니다.

freopen은 열려진 파일 스트림을 입력 인자로 전달하고 fdopen은 파일 디스크립터를 전달합니다.

#include <stdio.h >

FILE *freopen(const char *pathname, const char *mode, FILE *fp);

FILE *fdopen(int fd, const char *mode);

반환 값: 실패 시 NULL

다음은 main 함수 인자로 파일 명을 전달하면 표준 출력을 해당 파일명으로 재지정합니다. 이 후 printf 함수를 호출하면 콘솔 화면에 출력하지 않고 재지정한 파일에 출력하는 것을 확인할 수 있습니다.

/**********************************************************************
* ex_freopen.c                                                        *
* exmple source – test freopen                                        *
**********************************************************************/

#include <stdio.h>

int main(int argc, char **argv)
{
    if(argc != 2)
    {   
        fprintf(stderr, "Usage:%s <file name> \n",argv[0]);
        return 1;
    }   

    FILE *fp = freopen(argv[1],"w",stdout);
    if(fp)
    {   
        printf("Hello Linux System Programming.\n");
        fclose(fp);
    }   
    else
    {   
        printf("failed\n");
    }   

    return 0;
}
[그림 5.8] ex_freoepn 실행 화면
[그림 5.8] ex_freoepn 실행 화면

다음은 fdopen 함수를 이용하여 표준 출력을 파일 스트림으로 재지정합니다. 이 후에 fprintf 함수를 호출하여 쓰기 작업을 수행하면 표준 출력으로 쓰기 작업을 수행하는 것과 같은 효과가 있는 것을 볼 수 있어요.

/**********************************************************************
* ex_fdopen.c                                                         *
* exmple source – test fdopen                                         *
**********************************************************************/

#include <stdio.h>

int main()
{
    FILE *fp = fdopen(1,"w");
    if(fp)
    {   
        fprintf(fp, "Hello Linux System Programming.\n");
        fclose(fp);
    }   
    else
    {   
        printf("failed\n");
    }   

    return 0;
}
[그림 5.9] ex_fdoepn 실행 화면
[그림 5.9] ex_fdoepn 실행 화면