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