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

Write dynamically allocated structure to file

假设我们有以下结构:

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

现在,我的问题:

我们如何使用包含指针的结构来做到这一点?我用同样的方法测试过,效果很好,可以读取数据,但是我想知道有没有风险?

你要的叫serialization. See also XDR (a portable binary data format) & libs11n(一个C++二进制序列化库);您经常关心数据的可移植性:能够在某些 不同 计算机上读取数据。

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

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

另请参阅 application checkpointing and persistence

出于实用的原因(特别是易于调试和弹性 w.r.t。小型软件进化)通常最好使用一些 textual data format (like e.g. JSON or Yaml)来存储此类持久数据。

您可能还对databases. Look first into sqlite, and also into DBMS ("relational" -or SQL based- ones like PostGreSQL, NoSQL ones like e.g. MongoDB)

感兴趣

问题不在于写单个动态分配的 struct(因为您主要想写数据内容,而不是指针,所以它与 fwrite 相同 malloc-ed struct or a locally allocated one), 它是序列化使用大量奇怪内部指针的复杂数据结构!

注意复制 garbage collectors use algorithms similar to serialization algorithms (since both need to scan a complex graph 个参考文献)。

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