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

时间:2009-07-29 23:37:45

标签: c file pointers

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

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);
    }
}

6 个答案:

答案 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)

迈克尔S是对的;将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)

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