Native/C

구조체 배열 파일로 저장하기

aucd29 2013. 10. 2. 18:48
[code]
#include <Turboc.h>

void WriteFriend();
void ReadFriend();

struct tag_Friend {
char Name[10];
int Age;
double Height;
};

tag_Friend Friends[256]={
{"성락동", 30, 178.2 },
{"조명현", 19, 169.8 },
{"조성현", 26, 176.5 },
{"박제현", 58, 172.3 },
{"", 0, 0 },
};

struct tag_Header {
char desc[32];
int ver;
int num;
};

int Num=4;

void main()
{
int sel,i;

for (;;) {
     gotoxy(15,20);
     printf("선택 (1:보기, 2:저장, 3:몽땅 삭제, 4:읽기, 9:종료 ) ");
     sel=getch();
     clrscr();

     switch (sel) {
     case '1':
         for (i=0;i<Num;i++) {
             gotoxy(2,2+i);
             printf("이름:%s, 나이:%d, 키:%.1f\n",
                Friends[i].Name,Friends[i].Age,Friends[i].Height);
         }
         puts("\n 출력 완료.");
         break;
     case '2':
         WriteFriend();
         break;
     case '3':
         memset(Friends,0,sizeof(Friends));
         Num=0;
         puts("\n\n 모든 레코드를 삭제했습니다.");
         break;
     case '4':
         ReadFriend();
         break;
     case '9':
         exit(0);
     }
}
}

// 구조체 배열을 파일로 저장하기
void WriteFriend()
{
FILE *f;
tag_Header H;

gotoxy(5,5);

f=fopen("c:\\Friend.dat","wb");
if (f == NULL) {
     puts("파일을 생성할 수 없습니다.");
} else {
     strcpy(H.desc,"친구목록");
     H.ver=100;
     H.num=Num;
     fwrite(&H,sizeof(tag_Header),1,f);
     fwrite(Friends,sizeof(tag_Friend),Num,f);
     fclose(f);
     puts("파일을 저장했습니다.");
}
}

// 파일로부터 구조체 배열 읽어오기
void ReadFriend()
{
FILE *f=NULL;
tag_Header H;

gotoxy(5,5);

f=fopen("c:\\Friend.dat","rb");

if (f == NULL) {
     puts("파일을 열 수 없습니다.");
} else {
     memset(Friends,0,sizeof(Friends));
     fread(&H,sizeof(tag_Header),1,f);
     if (strcmp(H.desc,"친구목록") != 0) {
         puts("주소록 파일이 아닙니다.");
         goto end;
     }
     if (H.ver != 100) {
         puts("버전이 틀립니다.");
         goto end;
     }

     Num=H.num;

     fread(Friends,sizeof(tag_Friend),Num,f);
     puts("파일을 읽었습니다.");
}
end:

if (f)
     fclose(f);
}
[/code]