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

TZt*_*ttt 7 c pointers file

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

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)

Mic*_*yan 6

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

  • 好吧,他从未说过需要可移植性,因此将结构直接写入文件系统的概念没有明显的错误.例如,我已经知道一两个语言前端与其解析树数据完全相同. (3认同)

Ara*_*raK 6

只是一个简单的例子:)

// 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,那么将写入文件的指针不是指针指向的实际数据.对不起,我没有编辑你的代码,因为它充满了编译错误:)

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


caf*_*caf 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个(以及使用`fread()`的逆函数)可以在任何一个机器架构上运行; 但是,它不可移植到其他架构.这可能与上下文无关,但值得一提的是完整性. (3认同)

Nor*_*sey 6

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

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

Tutilis = malloc (sizeof (*Tutilis));
  ...
fwrite(Tutilis, sizeof (*Tutilis), 1, f);
Run Code Online (Sandbox Code Playgroud)

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


Bli*_*ndy 0

我会首先查看符号名称,例如NULLfprint,更不用说那个奇怪的\0。作为一个额外的想法,您应该在写入后关闭文件,以确保将其刷新到磁盘,并仔细检查该futilis变量是否char*包含有效的可写路径。