프로세스의 메모리 상태를 파일에 기록해 두었다가 다음 실행 시점에 로딩하여 상태를 복원하는 것은 매우 흔한 일입니다. 이 때 텍스트 모드로 모든 멤버를 하나 하나 기록하여 로딩하는 것 보다 메모리를 덤핑하여 파일에 기록하고 로딩하는 바이너리 모드의 입출력 함수를 사용하는 것이 효과적입니다. 표준 입출력 라이브러리에서는 바이너리 모드의 입출력 함수로 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 실행 화면
'프로그래밍 기술 > 리눅스(Unix) 시스템 프로그래밍' 카테고리의 다른 글
표준 입출력 - 파일 스트림 작업 위치 변경 및 확인, fseek, ftell, rewind (0) | 2017.08.03 |
---|---|
표준 입출력 - 텍스트 모드 입출력 함수들 (0) | 2017.08.01 |
표준 입출력 - 텍스트 모드와 바이너리 모드 입출력 (0) | 2017.08.01 |
표준 입출력 - freopen, fdopen (2) | 2017.07.28 |
표준 입출력 - fopen, fclose (0) | 2017.07.28 |
RAW 입출력과 표준 입출력의 성능 비교 (0) | 2017.07.27 |
표준 입출력 - FILE 구조체 (0) | 2017.07.27 |
표준 입출력 - 버퍼 및 버퍼링 정책 설정 (0) | 2017.07.27 |
파일입출력 - 버퍼링 (0) | 2017.07.25 |
표준 입출력 라이브러리 (0) | 2017.07.25 |