【发布时间】:2015-03-17 05:55:53
【问题描述】:
我正在尝试创建一个程序,该程序可以将指向的信息也保存在文件中。所以我可以加载它并在以后使用它。
这是我的两个结构体:
typedef struct{
char name[11];
char efternamn[11];
}person;
typedef struct{
int numbofpersons;
person * personList;
}personGOD;
personGOD controller;
int choice;
do
{
printf("(1) to Initialize x amount of persons\n"
"(3) to Save\n"
"(5) Load controller\n");
scanf("%d", &choice);
switch (choice)
{
case 1 :
InitializePersons(&controller);
break;
case 3 :
SavePersonsToFile(&controller);
break;
case 5 :
LoadController(&controller);
break;
}
}
while(flag);
这里是加载、保存、初始化函数:
void InitializePersons(personGOD* controller)
{
int amount, i;
printf("How many persons to be created");
fscanf(stdin, "%d", &amount);
controller->personList = (person*)calloc(amount, sizeof(person));
for(i=0; i < amount; i++)
{
printf("Name: ");
fscanf(stdin, "%s", controller->personList[i].name);
printf("lastname: ");
fscanf(stdin, "%s", controller->personList[i].efternamn); //eftername=lastname
}
controller->numbofpersons = amount; // update how many persons we current have
}
void SavePersonsToFile(personGOD* controller)
{
FILE* fileptr;
if((fileptr = fopen("C:\\Users\\x\\Desktop\\OpenStruct\\persons", "r+b"))== NULL)
{
fprintf(stderr, "Error opening file: %s\n", strerror( errno ));
exit(0);
}
if(fwrite(controller, sizeof(personGOD), 1, fileptr)<1)
fprintf(stderr, "%s\n", strerror( errno ));
fclose(fileptr);
}
void LoadController(personGOD* controller)
{
FILE* fileptr;
if((fileptr = fopen("C:\\Users\\x\\Desktop\\OpenStruct\\persons", "r+b"))== NULL)
{
fprintf(stderr, "Error opening file: %s\n", strerror( errno ));
exit(0);
}
if(fread(controller, sizeof(personGOD), 1, fileptr)<1){
fprintf(stderr, "%s\n", strerror( errno ));
}
fclose(fileptr);
}
当我保存->关闭程序->打开->加载时会发生什么,numofpersons 是正确的,而 personList 将指向不再分配的内存并崩溃。
很难在谷歌上搜索如何实现这一点。
如何保存和恢复指向的数据
【问题讨论】:
-
是的,没那么简单。指针通常只是内部对应于内存位置的 64(或 32)位数字,因此当您将 personGOD 写出时,它只会写入 numbofpersons(以二进制字节为单位),然后是指针 8(或 4)字节的二进制数据,并且可能在两者之间添加了一些结构填充。您需要手动对数据进行显式编码和解码。
-
谷歌“序列化”。
-
我建议使用一些 json(或 xml,如果你愿意)库来写和读回你的数据,除非你绝对需要二进制文件 Firmat。