什么是超载>>的优雅方式运算符是否为新文件类型?

时间:2013-02-14 18:48:24

标签: c++ inheritance file-io operator-overloading

我正在为一些遗留代码添加一些新功能。现有代码从文本文件中读取一些数据。在新版本中,我将阅读更多数据,并希望使用二进制文件,最重要的是,程序可以在Linux或Windows上使用相同(外部)数据文件,所以我想强制执行读取二进制数据时的大端意义。

为此,我创建了一个新的输入文件流类型 - 继承自ifstream - 带有重载的“>>”从文件中读取二进制数据的运算符,将其解释为big-endian。到目前为止一切都很好。

现在,当我从文件中读取数据时,我需要选择要创建哪种类型的输入文件流对象:处理旧文本文件时使用常规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,那么我可以制作“&gt;&gt;”操作员虚拟,但因为它不是我不知道解决方案是什么,如果有的话。

1 个答案:

答案 0 :(得分:2)

所有当前iostream类的抽象是 格式化文本。你想从任何一个派生出来 std::istreamstd::ostream个类;你想创造 你自己的等级。你可能想要衍生出来 std::basic_ios<char>,用于错误处理和streambuf 管理。同样,可能确实想要使用streambuf 及其派生类。