Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将结构追加到文件_C_File_Struct - Fatal编程技术网

C 将结构追加到文件

C 将结构追加到文件,c,file,struct,C,File,Struct,我正在做一个项目,我需要在二进制文件中保存结构。我想在不覆盖的情况下将结构附加到文件中。它适用于一条记录,但当我添加第二条记录并尝试读取该文件时,会出现分段错误 #包括 #包括 #包括 int main(){ 结构索引{ 字符*冲突; 字符*分辨率; }; 结构索引*new_conflict=malloc(sizeof(结构索引)); 新建\u冲突->冲突=“冲突”; 新建\u冲突->解决=“解决”; 文件*conflict\u index=fopen(“conflict\u index”,“a

我正在做一个项目,我需要在二进制文件中保存结构。我想在不覆盖的情况下将结构附加到文件中。它适用于一条记录,但当我添加第二条记录并尝试读取该文件时,会出现分段错误

#包括
#包括
#包括
int main(){
结构索引{
字符*冲突;
字符*分辨率;
};
结构索引*new_conflict=malloc(sizeof(结构索引));
新建\u冲突->冲突=“冲突”;
新建\u冲突->解决=“解决”;
文件*conflict\u index=fopen(“conflict\u index”,“ab+”);
if(冲突索引){
fwrite(&new_conflict,sizeof(struct index),1,conflict_index);
fwrite(&new_conflict,sizeof(struct index),1,conflict_index);
fclose(冲突指数);
}
冲突指数=fopen(“冲突指数”,“rb”);
if(冲突索引){
而(1){
结构索引*object2=malloc(sizeof(结构索引));
if(!fread(&object2,sizeof(结构索引),1,冲突索引))
打破
printf(“写入冲突索引:冲突%s”,object2->conflict);
printf(“写入冲突索引:分辨率%s”,object2->RESOLUTION);
}
fclose(冲突指数);
}
返回0;
}        
有人能帮忙吗。 谢谢

这些是指向字符的指针。如果你写了它们,这是好的,但是如果你读了它们,那么就没有为它们分配内存,导致了分段错误

更好的方法是将其设置为固定大小的字符串,以便可以写入和读取,例如:

   struct index {
      char conflict[50];
      char resolution[50];
   };

(还要注意的是,您不写字符串,只写指针值。在读回时,您会一次又一次地分配对象,而不将其存储在某个位置,因此会泄漏内存。)

正如Paul已经提到的,指针必须改为数组。i、 e

   struct index {
      char* conflict;
      char* resolution;
   };

在分析数组应包含的最大字符后,可以给出数组大小

此外,我想指出所使用的fwrite和fread代码不正确。

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
fwrite和fread函数需要指针,但传递的参数是指向指针的指针。在代码中fwrite和fread是

fwrite(&new_conflict, sizeof(struct index), 1, conflict_index);
fread(&object2, sizeof(struct index), 1, conflict_index)

新建\u冲突和object2已经是指向结构索引的指针。所以代码应该如下所示

fwrite(new_conflict, sizeof(struct index), 1, conflict_index);
fread(object2, sizeof(struct index), 1, conflict_index)


如何使用char*修复代码?我不知道绳子的确切尺寸,可能很长,也可能很短。这只是一个示例,内存泄漏没有问题。如果要写入和读取固定大小的记录,必须使字段最长,以接受并截断任何更长的输入。
fwrite(&new_conflict, sizeof(struct index), 1, conflict_index);
fread(&object2, sizeof(struct index), 1, conflict_index)

fwrite(new_conflict, sizeof(struct index), 1, conflict_index);
fread(object2, sizeof(struct index), 1, conflict_index)