C 将结构保存到文件

C 将结构保存到文件,c,struct,file-io,C,Struct,File Io,我正在尝试将结构列表保存到文件中,稍后再加载它们 我想从对象数组输出第一个对象的数据,但当我试图通过指针(变量:name,age)加载和打印结构的对象时,程序的输出是这样的:name:| age:0 所期望的是:姓名:汤姆|年龄:15 (例如个人对象[3]={“汤姆”,15,“安德鲁”,25,“凯特”,55};的示例输入) 我尝试为此使用fseek函数,如何使用它仅打印第一个对象 #包括 #包括 类型定义结构 { 字符名[20]; 智力年龄; }人; 无效保存(int x,char way[10

我正在尝试将结构列表保存到文件中,稍后再加载它们

我想从对象数组输出第一个对象的数据,但当我试图通过指针(变量:
name
age
)加载和打印结构的对象时,程序的输出是这样的:
name:| age:0

所期望的是:
姓名:汤姆|年龄:15

(例如
个人对象[3]={“汤姆”,15,“安德鲁”,25,“凯特”,55};
的示例输入)

我尝试为此使用
fseek
函数,如何使用它仅打印第一个对象

#包括
#包括
类型定义结构
{
字符名[20];
智力年龄;
}人;
无效保存(int x,char way[100],person(*p_object)[x]);
无效荷载(字符方式[100],整数x);
文件*文件;
内部主(空)
{
char way[100]=“D:\\Projects\\C\\C06\u处理文件\\C005\u在stream.dat中的位置”;
person-object[3]={“汤姆”,15,“安德鲁”,25,“凯特”,55};
person(*p_object)[3]=&object;
保存((sizeof(*p_对象)/sizeof(*p_对象)[0]),方式,p_对象);
荷载(方式1);
fclose(文件);
返回0;
}
无效保存(int x,char way[100],person(*p_object)[x])
{
如果(fopen(方式,“r”)==NULL)
{
文件=fopen(方式,“w”);
}
char*c=(char*)p_对象;
对于(int i=0;i名称,p|u对象->年龄);
}

下面是一个实现,它可以满足您的要求:

#包括
类型定义结构{
字符名[20];
智力年龄;
}人;
void save(int num,char path[100],person(*p_object)[num]);
人员负载(字符路径[100],整数索引);
内部主(空){
字符路径[100]=“output.dat”;
person persons[3]={“汤姆”,15,“安德鲁”,25,“凯特”,55};
保存(3、路径和人员);
人员对象=负载(路径,1);
printf(“\n名称:%s |年龄:%d\n”,object.name,object.Age);
返回0;
}
无效保存(int num,char path[100],person(*p_object)[num]){
FILE*FILE=fopen(路径“w+”);
fwrite(p_对象,sizeof(person),num,file);
fclose(文件);
}
人员负载(字符路径[100],整数索引){
人客体;
FILE*FILE=fopen(路径“r”);
fseek(文件,(长)sizeof(人)*索引,SEEK\u集);
fread(&object,sizeof(person),1,文件);
fclose(文件);
返回对象;
}
请注意,最好使用现有函数,而不是自己实现

这将使您的代码更简单、更直接


此外,您对
fread
的实现也不正确,因为EOF可能会出现在那里,因为您正在编写二进制数据,所以需要读取结构的整个大小才能加载它。

指出代码的具体问题以及代码如何避免这些问题将非常有用。更新了“bug”部分,我的实现只是为了改进代码,而不仅仅是修复代码。非常感谢您对“fwrite”和“fread”函数的回答。我不知道这件事。它比我自己的实现更方便。它是否将数据保存到文件中?您正在检查文件是否存在,如果是,则不实例化“文件”指针。所以,在文件存在的情况下,它不会保存数据。最好在save()和load()函数中成对使用fopen()/fclose,并将fopen分配给每个函数中的“file”指针变量。