我有类似这样的东西,实际上比这更复杂的结构:
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)
返回错误的大小,而不是真正的可变大小。
有一种方法可以将其保存到文件和文件中。在不知道尺寸的情况下恢复?
答案 0 :(得分:4)
您正在尝试序列化,或marshal结构。你不能只是fwrite
数据(指针是最明显的止损)。与文件中的存储指针相比,sizeof
问题确实很小(指针在它所源自的程序之外毫无意义)。
您必须定义自己的序列化/反序列化功能。您可以使用自己的简单格式,也可以使用JSON,XML,XDR或类似的内容。
就我个人而言,我会选择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)
看起来你真正想做的就是存储结构和指针指的是什么,而不是指针本身。
您需要编写一些逻辑来确定所指向数据的大小,并将该数据写入文件而不是指针。