[리눅스 시스템 프로그래밍] 5.9 바이너리 모드 입출력 함수, fread, fwrite

프로세스의 메모리 상태를 파일에 기록해 두었다가 다음 실행 시점에 로딩하여 상태를 복원하는 것은 매우 흔한 일입니다. 이 때 텍스트 모드로 모든 멤버를 하나 하나 기록하여 로딩하는 것 보다 메모리를 덤핑하여 파일에 기록하고 로딩하는 바이너리 모드의 입출력 함수를 사용하는 것이 효과적입니다. 표준 입출력 라이브러리에서는 바이너리 모드의 입출력 함수로 fread와 fwrite를 제공하고 있어요.

#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);

반환 값: 읽거나 기록한 object 개수

다음은 사용자 정의 형식인 Member 구조체를 원소로 하는 배열의 내용을 파일에 기록하였다가 로딩하여 출력하는 예제 코드입니다.

/**********************************************************************
* ex_binio.c                                                          *
* exmple source – test binary I/O                                     *
**********************************************************************/

#include <stdio.h>

#define MAX_NAME_LEN    20
typedef struct _Member Member;
struct _Member
{
    char name[MAX_NAME_LEN+1];
    int age;
    int num;
};

void Write();
void Read();
int main()
{
    Write();
    Read();
    return 0;
}

void Write()
{
    Member base[4]=
    {
        {"홍길동",20,3}, {"강감찬",30,4},{"김유신",70,1},{"이순신",35,2}
    };
    FILE *fp= fopen("memdata","wb");
    fwrite(base, sizeof(Member),4, fp);
    fclose(fp);
}
void Read()
{
    Member base[4];
    FILE *fp= fopen("memdata","rb");
    fread(base, sizeof(Member),4, fp);
    fclose(fp);
    int i = 0;

    printf("이름    번호    나이\n");
    for(i=0;i<4;i++)
    {
        printf("%-12s %-6d %d\n", base[i].name, base[i].num, base[i].age);
    }
}
[그림 5.12] ex_binio 실행 화면
[그림 5.12] ex_binio 실행 화면