gpt4 book ai didi

c++ - 如果结构已更改,则将结构读取和写入二进制文件

转载 作者:太空狗 更新时间:2023-10-29 21:01:53 25 4
gpt4 key购买 nike

我有以下结构

struct MyStruct
{
int param1;
float param2;
double param3;
}

我可以使用

将其写入二进制文件
fstream binary_file(file, ios::out|ios::binary); 
binary_file.seekg(0, ios::beg);
binary_file.write((char *)aStruct,sizeof(MyStruct));
binary_file.close();

我可以使用

恢复它
ifstream binary_file;
binary_file.open(file, ios::binary);
binary_file.seekg(0, ios::beg);
binary_file.read((char *)aStruct, sizeof(MyStruct));
binary_file.seekg (0, ios::end);
binary_file.close();

一切正常。现在将结构的定义更改为

struct MyStruct
{
int param1;
float param2;
double param3;
int paramA;
float paramB;
double paramC
}

问题是,如果我读取一个在定义更改之前写入的文件,param1、param2 和 param3 是否总是正确设置,我能否确定 paramA、paramB 和 paramC 不会被分配任何垃圾?参数只会添加到结构的末尾。

根据reference如果在读取指定位数之前遇到 eof,则 ifstream 读取函数应该停止,因此希望这听起来很简单。我的测试还表明问题的答案是肯定的,但是我想和你们确认一下,因为我一直在阅读二进制文件中的填充示例,但并不完全理解它是如何工作的。

最佳答案

The question is, if I read a file which was written before the definition change, will param1, param2 and param3 always be correctly set

是的,你可以肯定这一点。

can I be sure that paramA, paramB and paramC will not be assigned any junk?

这也是正确的,但有一个警告:除非这些字段在构造函数中初始化,否则它们在读取后将保持未初始化状态(即包含“垃圾”)。

最后,请注意,此技巧仅适用于从二进制文件中读取单个 struct。如果您需要保存这样的 struct 数组,则必须存储在写出数据时有效的 sizeof,否则您不会能够正确划分数组。

显然,更改为不同的编译器或同一编译器的不同版本也可以使用此方案,即使没有在 struct 的末尾添加新字段也是如此。

关于c++ - 如果结构已更改,则将结构读取和写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16944217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com