将动态分配的结构写入文件

时间:2015-02-06 18:57:55

标签: c io structure

假设我们有以下结构:

    struct Something {
        int i;
    };

如果我想在文件中写入任何此类数据(动态分配),我会这样做:

struct Something *object = malloc(sizeof(struct Something));
object->i = 0; // set member some value
FILE *file = fopen("output_file", "wb");
fwrite(object, sizeof(struct Something), 1 file);
fclose(file);

现在,我的问题:

我们如何使用包含指针的结构?我使用相同的方法测试,它工作正常,数据可以读取,但我想知道是否有任何风险?

1 个答案:

答案 0 :(得分:2)

您想要的是serialization。另请参阅XDR(便携式二进制数据格式)& libs11n(C ++二进制序列化库);您经常关心数据可移植性:能够读取某些不同计算机上的数据。

"序列"意味着"转换"一些复杂的数据结构(例如list,一个tree,一个向量,甚至是你的Something ...)到(串行)字节流(例如文件,网络连接,等......),倒退。处理循环数据结构或共享子组件可能很棘手。

你不想在文件中写入原始指针(但你可以),因为写入地址可能在你下次执行程序时没有任何意义(例如因为{{3 }},即当你再次读取数据时。

另请阅读ASLRapplication checkpointing

出于实际原因(特别是易于调试和弹性较小的软件演变),通常最好使用一些persistence数据格式(例如textualJSON)来存储持久数据。

您可能也对Yaml感兴趣。首先进入databases,然后进入DBMS("关系" - 或sqlite - 基于SQLPostGreSQL等类似{{3} }})

问题不在于编写单个动态分配的struct(因为您希望主要编写数据内容,而不是指针,因此它与fwrite malloc相同 - ed struct或本地分配的),它是序列化使用大量奇怪的内部指针的复杂数据结构!

请注意,复制NoSQL使用类似于序列化算法的算法(因为两者都需要扫描复杂的MongoDB引用。)

此外,在今天的计算机上,磁盘 - 或网络 - IO比CPU慢很多(例如一百万次),因此在写入文件之前进行一些重要的计算是有意义的。