如何在文件中保存struct … C lang

我想在文件中保存一个结构。 我想实现一个使这项工作的function。 我尝试了这段代码,但它没有用。

struct utilisateur // enregestrement pour sauvegarder les details de l utilisateur { char nom[20]; char prenom[20]; int place; char depart[20]; char arrive[20]; char sexe; int nwagon; }; struct utilisateur utilis; struct utilisateur *Table[48]; void crea_fich(struct utilisateur *Tutilis) // creation un fichier, vous introduiez le nom, et le sotcker par enreg { FILE *f; if (f!==0) { printf("error in the name of file \n"); exit(1); } if (f=fopen(futilis,"w")==Null){ fprint("We can't creat file \n"); exit(1); } else{ f=fopen("futilis.dat","wb"); fwrite(Tutilis ,sizeof(utilisateur),1,f); } } 

不需要。您需要逐个单独写出您的数据成员。 您不应该盲目地将结构的内存表示复制到文件输出缓冲区中(很明显,您正在尝试这样做)。 以这种方式编写文件会导致文件不可移植(除非在编写它们的平台上,否则它们不可读),因为结构元素的字节序和特定于平台的填充。

试试这个,然后如果那不是你想要的,试着解释它与你想要的不同。

 void crea_fich(struct utilisateur *Tutilis) { FILE *f; size_t nwritten; f = fopen("futilis.dat","wb"); if (f == NULL) { fprintf(stderr, "Cannot open file for writing.\n"); exit(1); } nwritten = fwrite(Tutilis, sizeof Tutilis[0], 1, f); fclose(f); if (nwritten < 1) { fprintf(stderr, "Writing to file failed.\n"); exit(1); } } 

迈克尔S是对的; 将fwrite与struct结合使用是非常不可移植的。 但是我们假设你并不关心这一点,你想要一些易于编写的东西。

您的代码中的问题是您已经破坏了sizeof的黄金法则: 永远不要将sizeof与类型名称一起使用 。 相反,你应该使用带有左值的sizeof ,并且几乎总是使用另一个参数解引用 。 从而

 Tutilis = malloc (sizeof (*Tutilis)); ... fwrite(Tutilis, sizeof (*Tutilis), 1, f); 

如果你遵循这个配方,那就更难弄错。

只是一个简单的例子:)

 // your struct struct Data { int first; double second; char third[10]; }; 

然后写结构!

 struct Data data = {22, 4.0, "Hi"}; FILE* output; output = fopen("Data.dat", "wb"); fwrite(&data, sizeof(data), 1, output); fclose(output); 

最后从您创建的文件中读取数据!

 struct Data data; FILE* input; input = fopen("Data.dat", "rb"); fread(&data, sizeof(data), 1, input); // you got the data from the file! fclose(input); 

二进制文件是噩梦,如果没有明智的书面和阅读。 您必须处理有关创建文件的体系结构以及将在何处读取的许多内容。 变量的Endianess和大小是最重要的。 此外,如果struct中有指针,则将写入文件的指针不是指针指向的实际数据。 对不起,我没有编辑你的代码,因为它充满了编译错误:)

我删除了我的第一个答案因为它错了,抱歉:)

我意识到这是一个旧post,但是当人们搜索这些信息时会出现,所以我会给出自己的解决方案。

这基本上是我在我的一个游戏中使用的。 我实际上在我自己的函数中有一些额外的库特定代码用于对话框,但实质上就是它。 我单独写数据。 我不认为我有这个数据的结构,但没有区别,只需单独编写您的单个结构成员。 如上所述,这种方式更好。

 // returns 1 if successful, 0 if not int savemap(const char *map_name) { FILE *file = NULL; // open the file in write binary mode file = fopen(map_name, "wb"); // always check return values to see if it was opened okay if(file == NULL) { fprintf(stderr, "Error opening file for writing.\n"); return 0; } // write file ID, version and pills fwrite(MAP_ID, sizeof(char), strlen(MAP_ID)+1, file); fwrite(&MAP_VER, sizeof(unsigned char), 1, file); fwrite(&pills, sizeof(unsigned short), 1, file); // write the map data (unsigned int map[315]) fwrite(&map, sizeof(unsigned int), 315, file); // never forget to close the file fclose(file); return 1; } 

我首先查看符号名称,如NULLfprint ,更不用说那些奇怪的\0 。 另外一点,你应该在写完之后关闭文件以确保它被刷新到磁盘,并仔细检查futilis变量是否包含一个有效的可写路径的char*