다음과 같이 fopen 함수에 파일 모드를 "wb"로 지정하여 파일을 쓰기/바이너리 모드(wb)로 연다.
FILE*fp=fopen("data.bin","wb");// 파일을 쓰기/바이너리 모드(wb)로 열기
이제 fwrite 함수를 사용하여 구조체 변수 d1을 파일에 저장한다.
fwrite 함수에는 값의 메모리 주소를 넣어야 하므로 &d1과 같이 변수의 주소를 넣어준다.
이때 동적 메모리를 할당한 포인터도 가능하다.
그리고 쓰기 크기는 구조체의 크기를 구해서 넣고, 쓰기 횟수는 1을 넣는다.
마지막에는 파일 포인터 fp를 넣어준다.
fwrite(&d1,sizeof(d1),1,fp);// 구조체의 내용을 파일에 저장
파일 쓰기가 끝났다면 fclose 함수로 파일 포인터를 닫는다.
fclose(fp);// 파일 포인터 닫기
구조체 변수 d1을 data.bin 파일에 저장한 모습을 그림으로 표현하면 다음과 같은 모양이 된다.
x86 플랫폼에서는 정수가 리틀 엔디언으로 저장되므로 0x64는 64 00이 된다.
이번에는 구조체에서 각 멤버의 크기를 다양하게 만들어서 파일에 써보자.
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지#include<stdio.h> // fopen, fwrite, fclose 함수가 선언된 헤더 파일#include<string.h> // strcpy, memset 함수가 선언된 헤더 파일#pragma pack(push, 1) // 1바이트 크기로 정렬structData{charc1;// 1바이트shortnum1;// 2바이트intnum2;// 4바이트chars1[20];// 20바이트};#pragma pack(pop) // 정렬 설정을 이전 상태(기본값)로 되돌림intmain(){structDatad1;memset(&d1,0,sizeof(d1));// 구조체 변수의 내용을 0으로 초기화d1.c1='a';// 문자 저장d1.num1=32100;// 2바이트 크기의 숫자 저장d1.num2=2100000100;// 4바이트 크기의 숫자 저장strcpy(d1.s1,"Hello, world!");// 문자열 저장FILE*fp=fopen("data2.bin","wb");// 파일을 쓰기/바이너리 모드(wb)로 열기fwrite(&d1,sizeof(d1),1,fp);// 구조체의 내용을 파일에 저장fclose(fp);// 파일 포인터 닫기return0;}
파일에 저장할 구조체를 보면 1바이트 크기의 char 타입, 2바이트 크기의 short 타입, 4바이트 크기의 int 타입, 20바이트 크기의 char 타입 배열이 멤버로 들어있다.
여기서 int 타입을 기준으로 구조체 정렬이 되면 파일에 썼을 때도 char c1;은 실제 크기보다 큰 공간을 차지하게 되므로 반드시 1바이트 크기로 정렬을 해준다.
#pragma pack(push, 1) // 1바이트 크기로 정렬structData{charc1;// 1바이트shortnum1;// 2바이트intnum2;// 4바이트chars1[20];// 20바이트};#pragma pack(pop) // 정렬 설정을 이전 상태(기본값)로 되돌림
이제 구조체 변수를 선언한 뒤 각 멤버에 값을 저장한다.
이때 구조체 변수는 반드시 memset 함수를 사용하여 0으로 초기화해 준다.
만약 0으로 초기화하지 않으면 배열 s1 부분에는 이전에 메모리에서 쓰던 값이 들어갈 수 있다.
structDatad1;memset(&d1,0,sizeof(d1));// 구조체 변수의 내용을 0으로 초기화d1.c1='a';// 문자 저장d1.num1=32100;// 2바이트 크기의 숫자 저장d1.num2=2100000100;// 4바이트 크기의 숫자 저장strcpy(d1.s1,"Hello, world!");// 문자열 저장
이제 fopen 함수로 파일을 쓰기/바이너리 모드(wb)로 열고, fwrite 함수로 구조체의 내용을 파일에 쓴다.
FILE*fp=fopen("data2.bin","wb");// 파일을 쓰기/바이너리 모드(wb)로 열기fwrite(&d1,sizeof(d1),1,fp);// 구조체의 내용을 파일에 저장
파일 쓰기가 끝났다면 fclose 함수로 파일 포인터를 닫는다.
fclose(fp);// 파일 포인터 닫기
구조체 변수 d1을 data2.bin 파일에 저장한 모습을 그림으로 표현하면 다음과 같다.