假设我们有以下结构:
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);
现在,我的问题:
我们如何使用包含指针的结构?我使用相同的方法测试,它工作正常,数据可以读取,但我想知道是否有任何风险?
答案 0 :(得分:2)
您想要的是serialization。另请参阅XDR(便携式二进制数据格式)& libs11n(C ++二进制序列化库);您经常关心数据可移植性:能够读取某些不同计算机上的数据。
"序列"意味着"转换"一些复杂的数据结构(例如list,一个tree,一个向量,甚至是你的Something
...)到(串行)字节流(例如文件,网络连接,等......),倒退。处理循环数据结构或共享子组件可能很棘手。
你不想在文件中写入原始指针(但你可以),因为写入地址可能在你下次执行程序时没有任何意义(例如因为{{3 }},即当你再次读取数据时。
另请阅读ASLR和application checkpointing。
出于实际原因(特别是易于调试和弹性较小的软件演变),通常最好使用一些persistence数据格式(例如textual或JSON)来存储持久数据。
您可能也对Yaml感兴趣。首先进入databases,然后进入DBMS("关系" - 或sqlite - 基于SQL,PostGreSQL等类似{{3} }})
问题不在于编写单个动态分配的struct
(因为您希望主要编写数据内容,而不是指针,因此它与fwrite
malloc
相同 - ed struct
或本地分配的),它是序列化使用大量奇怪的内部指针的复杂数据结构!
请注意,复制NoSQL使用类似于序列化算法的算法(因为两者都需要扫描复杂的MongoDB引用。)
此外,在今天的计算机上,磁盘 - 或网络 - IO比CPU慢很多(例如一百万次),因此在写入文件之前进行一些重要的计算是有意义的。