我想在文件中保存一个结构.我想实现一个使这个工作的功能.我尝试了这段代码,但它没有用.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
不需要.您需要逐个单独写出您的数据成员.您不应该盲目地将结构的内存表示复制到文件输出缓冲区中(很明显,您正在尝试这样做).以这种方式编写文件会导致文件不可移植(除非在编写它们的平台上,否则它们不可读),因为结构元素的字节序和特定于平台的填充.
只是一个简单的例子:)
// your struct
struct Data
{
int first;
double second;
char third[10];
};
Run Code Online (Sandbox Code Playgroud)
然后写结构!
struct Data data = {22, 4.0, "Hi"};
FILE* output;
output = fopen("Data.dat", "wb");
fwrite(&data, sizeof(data), 1, output);
fclose(output);
Run Code Online (Sandbox Code Playgroud)
最后从你创建的文件中读取数据!
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);
Run Code Online (Sandbox Code Playgroud)
二进制文件是噩梦,如果没有明智的书面和阅读.您必须处理有关创建文件的架构以及将在何处读取的大量内容.变量的Endianess和大小是最重要的.此外,如果你的指针内有指针struct,那么将写入文件的指针不是指针指向的实际数据.对不起,我没有编辑你的代码,因为它充满了编译错误:)
我删除了我的第一个答案因为它错了,抱歉:)
试试这个,然后如果那不是你想做的,试着解释它与你想要的有什么不同.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
迈克尔S是对的; 使用fwrite结构是非常不可移植的.但是我们假设你并不关心这一点,你想要一些易于编写的东西.
你的代码中的问题是你已经破坏了黄金法则sizeof:永远不要使用sizeof类型名称.相反,你应该使用sizeof左值,并且几乎总是使用另一个参数的解引用.从而
Tutilis = malloc (sizeof (*Tutilis));
...
fwrite(Tutilis, sizeof (*Tutilis), 1, f);
Run Code Online (Sandbox Code Playgroud)
如果你遵循这个配方,那就更难弄错.
我会首先查看符号名称,例如NULL和fprint,更不用说那个奇怪的\0。作为一个额外的想法,您应该在写入后关闭文件,以确保将其刷新到磁盘,并仔细检查该futilis变量是否char*包含有效的可写路径。