在C中fwrite / fread动态链表的最佳方法

时间:2013-11-30 10:48:23

标签: c fwrite fread

我有这个结构:

struct data
{
    int id;
    char *title;
    char *description;
    int year;
};

现在我必须使用fwrite将列表保存在文件中,然后使用fread读取它。

最好的方法是什么?我不能做像

这样的事情
fwrite(info, sizeof(struct data), 1, ptr_file);

因为结构有两个指针。如果我逐字段编写并使用strlen来编写字符串,那么在阅读时如何知道每个字符串的大小?

感谢。

2 个答案:

答案 0 :(得分:2)

您不能使用指向文件的指针编写结构,因为它会写入指针而不是它们指向文件的内容。这意味着当您稍后尝试读取结构时,指针将指向“随机”内存。

您可能想了解serialization

一个简单的方案是分别编写idyear成员,然后是第一个字符串的长度(作为固定大小的值),后跟字符串,然后是字符串的长度。第二个字符串和实际字符串。

另一种更简单的方法是使用固定大小的数组而不是字符串的指针。这样做的缺点是,如果不使用为阵列分配的所有空间,那么就会浪费一些内存。更糟糕的缺点是你不能拥有比数组更大的字符串。

答案 1 :(得分:0)

您必须编写自己的序列化函数或不使用指针。这实际上取决于你的任务。我更喜欢在任何地方使用固定长度阵列。

如果您的任务更复杂,请查看tpl等库来序列化您的数据结构。