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

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

现在,我的问题:

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

最佳答案

你要的叫serialization .另见 XDR (一种可移植的二进制数据格式)& libs11n (一个 C++ 二进制序列化库);您经常关心数据的可移植性:能够在一些不同的计算机上读取数据。

“序列化”意味着将一些复杂的数据结构(例如 listtree 、 vector 甚至您的 Something...)“转换”为(串行)字节流(例如文件、网络连接等),并向后。处理循环数据结构或共享子组件可能很棘手。

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

另请阅读 application checkpointingpersistence .

出于实用的原因(特别是易于调试和弹性 w.r.t. 小型软件进化)通常最好使用一些 textual数据格式(例如 JSONYaml )来存储此类持久数据。

您可能还对 databases 感兴趣.先看sqlite , 以及 DBMS(“关系”-或基于 SQL 的-像 PostGreSQL , NoSQLMongoDB 这样的)

问题不是写一个动态分配的struct(因为你主要想写数据内容,而不是指针,所以它是一样的fwrite一个malloc-ed struct 或本地分配的),它用于序列化使用大量奇怪内部指针的复杂数据结构!

注意复制 garbage collectors使用类似于序列化算法的算法(因为两者都需要扫描复杂的 graph 引用文献)。

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

关于c - 将动态分配的结构写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28372855/

相关文章:

c - 提取和添加排序

CMake - 始终构建特定文件

c - Sscanf - 使用不同的分隔符进行解析

c - 仅打印字符串中的字母

c++ - C/C++ - 指针传递给 DLL 中的函数

c - 用于存储程序的 Linux 内存映射区域

c - 将数据从微 Controller 发送到另一个

java - 读入一个没有标点符号的文件

c - 为结构指针分配内存

c - 不是 c 中结构的预期结果循环