표준 입출력 - 바이너리 모드 입출력 함수, 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 실행 화면