#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
typedef struct student {
int id;
char name[12];
double points;
} STUD;
STUD * read_students_binary(char *filename) {
FILE *fp;
int i = 0;
fp = fopen(filename,"rb");
fseek(fp,0,SEEK_END);
int count = ftell(fp)/sizeof(STUD); // 파일의 STUD 개수만큼 count변수에 저장
STUD* bin;
bin = (STUD*)calloc(count,sizeof(STUD)); //이진파일에 저장된 구조체 수만큼 동적할당
fread(&bin,sizeof(STUD),count-1,fp); // 동적할당된 bin에 STUD크기만큼 count-1개를 옮겨씀
bin[count-1].id = -1; //마지막을 표시하기위해 마지막 구조체의 id에 -1값 저장
for(i=0;i<8;i++) // 구조체에 잘 들어갔나 확인
printf("%d %s %lf\n", bin[i].id, bin[i].name, bin[i].points);
fclose(fp);
return NULL;
}
void save_students_binary(STUD *ps, char *filename) {
FILE *fd = fopen(filename, "wb");
STUD *pcur = ps;
int nitem = 0;
if (fd) {
while (pcur->id > 0) pcur++;
fwrite(ps, sizeof(STUD), pcur - ps, fd);
fclose(fd);
}
}
int main(void) {
char *filename = "binary";
STUD test_data[] = { {1, "Choi", 9.9}, {2, "Park", 0.1}, {3, "Kim", 5.0 },
{4, "Lee", 9.9 }, {5, "Moon", 9.5 }, {6, "Kang", 7.0 }, {7, "Jeon", 0.9 }, {-1, "", 0 } };
STUD *students = test_data;
save_students_binary(students, filename);
read_students_binary(filename);
return 0;
}
함수 read_students_binary에서 fread(&bin,sizeof(STUD),count-1,fp); 이부분 이렇게 하면 동적 할당된 구조체에 미리 이진파일에 저장한 구조체들이 다 복사되서 들어가는거 아닌가요??
잘들어갔나 확인하려고
for(i=0;i<8;i++) // 구조체에 잘 들어갔나 확인
printf("%d %s %lf\n", bin[i].id, bin[i].name, bin[i].points);
이거 돌려보면 다 그냥 초기에 동적할당한 0값이 뜨길래 질문합니더..
댓글 0