假设我们有以下结构:
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 .另见 XDR (一种可移植的二进制数据格式)& libs11n (一个 C++ 二进制序列化库);您经常关心数据的可移植性:能够在一些不同的计算机上读取数据。
“序列化”意味着将一些复杂的数据结构(例如 list 、 tree 、 vector 甚至您的 Something
...)“转换”为(串行)字节流(例如文件、网络连接等),并向后。处理循环数据结构或共享子组件可能很棘手。
您不想在文件中写入原始指针(但您可以),因为写入的地址在您的程序的下一次执行时可能没有任何意义(例如因为 ASLR ),即当您将再次读取数据。
另请阅读 application checkpointing和 persistence .
出于实用的原因(特别是易于调试和弹性 w.r.t. 小型软件进化)通常最好使用一些 textual数据格式(例如 JSON 或 Yaml )来存储此类持久数据。
您可能还对 databases 感兴趣.先看sqlite , 以及 DBMS(“关系”-或基于 SQL 的-像 PostGreSQL , NoSQL 像 MongoDB 这样的)
问题不是写一个动态分配的struct
(因为你主要想写数据内容,而不是指针,所以它是一样的fwrite
一个malloc
-ed struct
或本地分配的),它用于序列化使用大量奇怪内部指针的复杂数据结构!
注意复制 garbage collectors使用类似于序列化算法的算法(因为两者都需要扫描复杂的 graph 引用文献)。
此外,在今天的计算机上,磁盘或网络 IO 比 CPU 慢很多(例如,一百万倍),因此在写入文件之前进行一些重要的计算是有意义的。
关于c - 将动态分配的结构写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28372855/