0

我正在向一些遗留代码添加一些新功能。现有代码从文本文件中读取一些数据。在新版本中,我将读取更多数据并希望使用二进制文件,除此之外,该程序可以在 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,那么我可以将“>>”运算符设为虚拟,但由于不是,我不知道解决方案是什么,如果有的话。

4

1 回答 1

2

当前所有 iostream 类的抽象都是格式化文本。您不想从任何 std::istreamstd::ostream类派生;您想创建自己的层次结构。您可能确实希望从中派生 std::basic_ios<char>, 以进行错误处理和streambuf 管理。同样,确实可能确实想使用streambuf 及其派生类。

于 2013-02-14T19:12:01.980 回答