ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ fopen(3) freopen(3) fdopen(3)
    C,C++ & Linux 2020. 5. 21. 02:13
    728x90

    함수 기능

    fopen

    파일을 열어주는 함수입니다.

    파일을 열게 되면 파일 스트림형 구조체 FILE* 을 리턴 받게 되는데 이는 자체적인 입출력 버퍼를 지닌다는 특징이 있습니다.

    이 버퍼는 시스템 버퍼가 아닌 라이브러리 레벨의 버퍼입니다.

     

    freopen

    파일을 닫고 다시 열어주는 함수입니다.

    주로 stdin, stdout, stderr 을 바꾸기 위해 쓰거나 접근 모드를 변경하기 위해 사용합니다.

     

    fdopen

    파일 디스크립터로 파일을 열어주는 함수입니다.

    open(), dup() 에서 쓰이는 파일 디스크립터와 연동되는 파일 스트림형 구조체를 얻기 위해 주로 사용합니다.

    함수 원형

    #include <stdio.h>
    FILE *fopen(const char *filepath, const char *mode);
    FILE *freopen(const char *filepath, const char *mode, FILE *fp);
    FILE *fdopen(int fd, const char *mode);

    매개변수

    filepath

    열고자 하는 파일의 경로

     

    mode

    파일의 접근 모드

     

    종류 설명
    r, rb 파일을 읽기전용으로 오픈, 쓰기 시도 시 에러 발생, 지정된 파일이 존재하지 않으면 fopen() 호출 시 NULL 리턴
    w, wb 파일을 쓰기전용으로 오픈, 지정한 파일이 존재하지 않으면 파일을 생성하고, 이미 있더라도 원래 데이터는 모두 초기화됨
    a, ab 파일을 이어쓰기모드로 오픈, 지정한 파일이 존재하지 않으면 파일을 생성하고, 이미 있으면 원래 데이터를 유지한 채로 새로운 데이터를 파일의 마지막에 추가
    이 모드로 열면 파일 중간의 내용을 덮어 쓸 수 없음
    r+, rb+, r+b 읽기 + 쓰기 모드로 오픈, 지정된 파일이 존재하지 않으면 fopen() 호출 시 NULL 리턴, 이미 존재한다면 원래 데이터를 유지
    w+, wb+, w+b 읽기 + 쓰기 모드로 오픈, 지정된 파일이 존재하지 않으면 파일 생성, 이미 존재한다면 원래 데이터는 모두 초기화됨
    a+, ab+, a+b 읽기 + 쓰기 모드이지만 이어쓰기모드로 오픈 a 모드와 다를게 없음

    b는 본래 바이너리 파일을 의미하지만 Linux/Unix 는 텍스트 파일과 바이너리 파일을 동일하게 취급하므로 의미가 없습니다.

     

    fp

    재지정할 파일 스트림형 포인터

     

    fd

    열고자 하는 파일의 파일 디스크립터

    반환값

    성공 시 파일 스트림형 구조체 리턴

    에러 시 NULL 리턴하고 errno 설정

    예제

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
        char *fname = "ssu_test.txt";
        char *mode = "r";
     
        if (fopen(fname, mode) == NULL) {
            fprintf(stderr, "fopen error\n");
            exit(1);
        }
    
        printf("파일 오픈 성공\n");
        exit(0);
    }
    

     

    결과

    예제2

    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int main(int argc, char *argv[]) {
        char *fname = "ssu_test.txt";
        int fd;
    
        // 파일을 읽기모드로 열고
        if ((fd = open(fname, O_RDONLY)) < 0) {
            fprintf(stderr, "open error\n");
            exit(1);
        }
    
        // stdout(표준 출력)을 ssu_test.txt 로 재지정
        // 이후 printf는 화면이 아닌 ssu_test.txt 에 저장됨
        if (freopen(fname, "w", stdout) != NULL) {
            printf("hihi\n");
        }
        exit(0);
    }
    

     

    결과

     

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ setbuf(3) setvbuf(3)  (0) 2020.05.21
    C/C++ fclose(3) fcloseall(3)  (0) 2020.05.21
    C/C++ getcwd(2) get_current_dir_name(2)  (0) 2020.05.21
    C/C++ chdir(2) fchdir(2)  (0) 2020.05.21
    C/C++ telldir(3) seekdir(3)  (0) 2020.05.20

    댓글

Designed by Tistory.