将动态分配的结构写入文件
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 慢很多(例如一百万倍),因此在写入文件之前进行一些重要的计算是有意义的。
假设我们有以下结构:
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 慢很多(例如一百万倍),因此在写入文件之前进行一些重要的计算是有意义的。