ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ fread(3) fwrite(3)
    C,C++ & Linux 2020. 5. 22. 03:12
    728x90

    함수 기능

    파일을 바이너리로 읽거나 쓰는 함수

    Linux/Unix 는 바이너리 파일을 구분하지 않기 때문에 큰 의미는 없으나 바이트 단위로 데이터를 읽거나 쓸때 유용합니다.

     

    함수 원형

    #include <stdio.h>
    
    size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp);
    size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp);

     

    매개변수

    ptr

    읽거나 쓸 데이터가 저장된 주소

     

    size

    읽거나 쓸 오브젝트의 단위 크기

     

    nobj

    오브젝트의 갯수

     

    fp

    데이터를 읽거나 쓸 파일 포인터

     

    반환값

    성공적으로 읽거나 쓴 오브젝트의 갯수

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    
    struct ssu_id {
        char name[64];
        int id;
    };
    
    int main(int argc, char *argv[]) {
        struct ssu_id t1, t2;
        char *fname = "ssu_exam.dat";
        FILE *fp;
    
        if ((fp = fopen(fname, "w+")) == NULL) {
            fprintf(stderr, "fopen error\n");
            exit(1);
        }
    
        printf("Input Name >>");
        gets(t1.name);
    
        printf("Input ID >>");
        scanf("%d", &t1.id);
    
    	// 입력받은 데이터를 이진파일로 쓰고
        if (fwrite(&t1, sizeof(struct ssu_id), 1, fp) != 1) {
            fprintf(stderr, "fwrite error\n");
            exit(1);
        }
    
        fflush(fp);
    	
    	// 파일포인터를 초기화하여
        rewind(fp);
    
    	// 아까 쓴 내용을 그대로 읽어서 출력
        if (fread(&t2, sizeof(struct ssu_id), 1, fp) != 1) {
            fprintf(stderr, "fread error\n");
            exit(1);
        }
    
        printf("Name = %s\nID = %d\n", t2.name, t2.id);
        exit(0);
    }
    

     

    결과

     

    예제2

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    
    struct ssu_pirate {
        unsigned long booty;
        unsigned int beard_length;
        char name[128];
    };
    
    int main(int argc, char *argv[]) {
        struct ssu_pirate blackbeard = {950, 48, "Edward Teach"}, pirate;
        char *fname = "ssu_data";
        FILE *fp1, *fp2;
    
        if ((fp1 = fopen(fname, "w")) == NULL) {
            fprintf(stderr, "fopen error\n");
            exit(1);
        }
    
        if ((fp2 = fopen(fname, "r")) == NULL) {
            fprintf(stderr, "fopen error\n");
            exit(1);
        }
    
    	// 에드워드 티치에 대한 정보를 저장
        if (fwrite(&blackbeard, sizeof(struct ssu_pirate), 1, fp1) != 1) {
            fprintf(stderr, "fwrite error\n");
            exit(1);
        }
    
    	// 파일을 닫기
        if (fclose(fp1)) {
            fprintf(stderr, "fclose error\n");
            exit(1);
        }
    
    	// 에드워드 티치에 대한 정보를 다시 읽어들임
        if (fread(&pirate, sizeof(struct ssu_pirate), 1, fp2) != 1) {
            fprintf(stderr, "fread error\n");
            exit(1);
        }
    
    	// 이름 출력
        if (puts(pirate.name) == EOF) {
            fprintf(stderr, "fputs error\n");
            exit(1);
        }
    
    	// 나머지 정보 출력
        printf("booty : %lu\nbeard_length = %u\n", pirate.booty, pirate.beard_length);
    
        if (fclose(fp2)) {
            fprintf(stderr, "fclose error\n");
            exit(1);
        }
        
        exit(0);
    }
    

     

    결과

     

     

     

     

     

     

     

     

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

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

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

    C/C++ ftell(3), ftello(3)  (0) 2020.05.22
    C/C++ fseek(3), fseeko(3)  (0) 2020.05.22
    C/C++ puts(3), fputs(3)  (0) 2020.05.22
    C/C++ gets(3), fgets(3)  (0) 2020.05.22
    C/C++ putc(3), fputc(3), putchar(3)  (0) 2020.05.22

    댓글

Designed by Tistory.