프로그래밍 기술/리눅스(Unix) 시스템 프로그래밍

표준 입출력 - 바이너리 모드 입출력 함수, fread, fwrite

언제나휴일 2017. 8. 3. 15:30
반응형

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

 

#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 실행 화면


반응형