如何在 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);
}
我最近了解到要正确阅读我们使用的文本文件
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);
}