我正在向一些遗留代码添加一些新功能。现有代码从文本文件中读取一些数据。在新版本中,我将读取更多数据并希望使用二进制文件,除此之外,该程序可以在 Linux 或 Windows 上使用相同的(外部)数据文件,所以我想强制执行读取二进制数据时的大端意义。
为此,我创建了一个新的输入文件流类型——从 ifstream 继承——带有一个重载的“>>”运算符,它从文件中读取二进制数据,将其解释为大端。到目前为止,一切都很好。
现在,当我从文件中读取数据时,我需要选择要创建的输入文件流对象的类型:处理旧文本文件时的常规 ifstream 或处理新二进制文件时的新“iBinFile”类型。我能想到的唯一解决方案是使用两段不同的代码,一段用于旧类型,另一段用于新类型,除了输入文件流类型之外,它们是相同的:
if (szFileName.compare(szFileName.size()-3,3,"bin")==0) {
iBinFile inFile(szFileName.c_str());
if (!inFile) {
cout << szFileName <<" file could not be opened" << endl;
exit (-1);
}
while(!inFile.eof())
inFile >> data;
}
else {
ifstream inFile(szFileName.c_str());
if (!inFile) {
cout << szFileName <<" file could not be opened" << endl;
exit (-1);
}
while(!inFile.eof())
inFile >> data;
}
但我觉得因为 iBinFile 是从 ifstream 派生的,所以应该有一种方法可以做到这一点,其中if
语句只确定文件类型,其他一切都是共同的。如果我从我自己的类中派生 iBinFile,那么我可以将“>>”运算符设为虚拟,但由于不是,我不知道解决方案是什么,如果有的话。