如何将动态结构保存到文件

时间:2011-08-17 11:38:03

标签: c file struct save

我有类似这样的东西,实际上比这更复杂的结构:

typedef struct _sample {
    unsigned char type;
    char *name;
    test *first;
} sample;
typedef struct _test {
    test *prev;
    test *next;
    char *name;
    int total;
    test_2 **list;
} test;
typedef struct _test_2 {
    char *name;
    unsigned int blabla;
} test_2;
sample *sample_var;

我想将此结构备份到文件中并在恢复后。

我也尝试使用fwrite(sample_var, sizeof(sample), 1, file_handle);,但真正的问题是sizeof(sample)返回错误的大小,而不是真正的可变大小。

有一种方法可以将其保存到文件和文件中。在不知道尺寸的情况下恢复?

4 个答案:

答案 0 :(得分:4)

您正在尝试序列化,或marshal结构。你不能只是fwrite数据(指针是最明显的止损)。与文件中的存储指针相比,sizeof问题确实很小(指针在它所源自的程序之外毫无意义)。

您必须定义自己的序列化/反序列化功能。您可以使用自己的简单格式,也可以使用JSONXMLXDR或类似的内容。

就我个人而言,我会选择JSON,因为无论如何它现在风靡一时。

顺便说一下,这里有一个C FAQ与你自己的问题模糊地联系在一起(虽然它讨论了互操作性问题)。

答案 1 :(得分:1)

没有简单的方法将这样的结构保存到文件中。例如,即使sample.name字段的大小为4(取决于体系结构),您可能要保存的内容是sample.name指向的内存内容。

这是一个可以执行此类操作的示例代码。您将不得不复制该过程以保存整个结构。

void saveToFile(FILE *fh, sample s)
{
  fwrite(s.type, sizeof(char), fh);
  int nameSize = strlen(s.name); // get the length of the name field
  fwrite(nameSize, sizeof(size_t), fh); // write the length of the name field
  frwite(s.name, nameSize * sizeof(char), fh); // write the content of the name field
  // continue with other fields
}

想法是存储下一个结构的大小,然后写入内容。要从文件中获取信息,请阅读大小,然后获取数据。

答案 2 :(得分:0)

sizeof(sample)不正确:它返回char的大小,后跟两个指针。如果需要保存这样的递归数据类型,则必须手动关注取消引用指针。

答案 3 :(得分:0)

看起来你真正想做的就是存储结构和指针指的是什么,而不是指针本身。

您需要编写一些逻辑来确定所指向数据的大小,并将该数据写入文件而不是指针。