3

我有以下结构

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 不会被分配任何垃圾吗?参数只会添加到结构的末尾。

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

4

2 回答 2

4

问题是,如果我读取在定义更改之前编写的文件,param1、param2 和 param3 是否总是正确设置

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

我可以确定 paramA、paramB 和 paramC 不会被分配任何垃圾吗?

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

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

显然,即使不将新字段添加到struct.

于 2013-06-05T15:45:54.957 回答
0

这可能对您有用,也可能不会。

如果编译器在添加新属性时更改了原始属性的填充,它将无法读取原始值。

如果填充(和字节序)没有改变,那么您很可能能够通过新属性中的未初始化数据成功地从文件中恢复单个记录。

于 2013-06-05T16:09:32.737 回答