我想在文件中保存结构。 我想实现一个使这个工作的功能。 我尝试了这段代码,但它没有用。
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);
}
}
答案 0 :(得分:6)
没有。您需要逐个单独写出您的数据成员。您不应该盲目地将结构的内存表示复制到文件输出缓冲区中(很明显,您正在尝试这样做)。以这种方式编写文件将导致文件不可移植(除非在编写它们的平台上,否则它们不可读),因为结构元素的字节序和特定于平台的填充。
答案 1 :(得分:6)
只是一个简单的例子:)
// your struct
struct Data
{
int first;
double second;
char third[10];
};
然后编写struct!
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
内有指针,则将写入文件的指针不是指针指向的实际数据。抱歉,我没有编辑你的代码,因为它充满了编译错误:)
我删除了我的第一个答案,因为它错了,抱歉:)
答案 2 :(得分:6)
试试这个,如果那不是你想要的,试着解释它与你想要的不同。
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);
}
}
答案 3 :(得分:6)
fwrite
与结构一起使用是非常不可移植的。但是我们假设你并不关心这一点,而你想要一些易于编写的东西可以起作用。
您的代码中存在的问题是您违反了sizeof
的黄金法则:从不使用类型名称为<{1}} 。相反,您应该将sizeof
与左值一起使用,并且几乎总是使用取消引用另一个参数。因此
sizeof
如果按照这个方法进行操作,那么大小就会变得更加困难。
答案 4 :(得分:1)
我意识到这是一篇旧帖子,但是当人们搜索这些信息时会出现,所以我会给出自己的解决方案。
这基本上就是我在其中一个游戏中使用的内容。我实际上在我自己的函数中有一些额外的库特定代码用于对话框,但实质上就是它。我单独写数据。我不认为我有这个数据的结构,但没有区别,只需单独编写您的单个结构成员。如上所述,这种方式更好。
// 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;
}
答案 5 :(得分:0)
我首先查看符号名称,例如NULL
和fprint
,更不用说奇怪的\0
了。另外一个想法是,您应该在写入后关闭文件以确保它被刷新到磁盘,并仔细检查futilis
变量是否包含有效的可写路径char*
。