C,C++ & Linux

C/C++ fread(3) fwrite(3)

KyooDong 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

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