如何在 C++ 中正确地从二进制文件中读取数据直到最后一个数据?

How to read data from binary files properly in C++ till the last data?

我最近了解到要正确阅读我们使用的文本文件

while(file>>var1>>var2){
   //do stuff with data
}

而不是

while(file){
   file>>var1>>var2;
   //do stuff with data
}

因为后者即使在读取最后一个数据项后也会执行一次额外的读取,并且在下一次读取时它能够读取 eof,所以如果我们有类似 std::vector<CLASSNAME>CLASSVECTOR 的东西,我们结束在向量中有一个额外的条目,而如果我们使用第一种方法,它只读取到最后一条记录。

我的问题是,如果是二进制文件,我该如何读取到最后一条记录? 所以如果我有类似的东西:

class class1 {
   int a;
   class2 obj2;
   class3 obj3;
public:
   void write_ binary(std::ofstream file) const;
   void read_file(std::ifstream file);
   //rest of class definition
};

我这样写 class :

void class1::write_ binary(std::ofstream file) const {
   file.write(reinterpret_cast<const char*>(&a),sizeof(a));
   obj2.write_binary(file); //this writes the data in the same way using 
   reinterpret_cast to ofstream file
   obj3.write_binary(file); //this writes the data in the same way using 
   reinterpret_cast to ofstream file
}

而且如果我这样阅读文件:

void class1::read_file(std::ifstream file) {
   file.read(reinterpret_cast<char*>(&a),sizeof(a));
   obj2.read_binary(file); //this reads data for obj2 in the same way using 
   read() and reinterpret_cast
   obj3.read_binary(file); //this reads data for obj3 in the same way using read() and reinterpret_cast
}

如果我想将此数据存储在这样的向量中:

class1 obj1;
std::vector<class1>records;

while(file)
{
   obj1.read_binary(file);
   records.push_back(obj1);
   //reset obj1 to initial state
}

我最终在 vector records 中获得了一条额外的记录。我不能使用 while(file>>obj1),因为我想对 cin 使用 >>。 请解释如何在不读取额外记录的情况下读取二进制文件。

与你的文本示例相同,file 上的测试必须在 之后 阅读而不是之前。

for (;;)
{
     obj1.read_binary(file);
     if (!file) // did the previous read fail?
         break; // if so quit the loop
     records.push_back(obj1);
}