0

いくつかのレガシーコードにいくつかの新しい機能を追加しています。既存のコードは、テキストファイルからいくつかのデータを読み取ります。新しいバージョンでは、はるかに多くのデータを読み込んでバイナリファイルを使用したいと考えています。さらに、プログラムは同じ(外部)データファイルを使用してLinuxまたはWindowsで使用できるため、強制したいと思います。バイナリデータを読み取るときのビッグエンディアンの意味。

そのために、ファイルからバイナリデータを読み取り、ビッグエンディアンとして解釈するオーバーロードされた「>>」演算子を使用して、新しい入力ファイルストリームタイプ(ifstreamから継承)を作成しました。ここまでは順調ですね。

ここで、ファイルからデータを読み取るときに、作成する入力ファイルストリームオブジェクトのタイプを選択する必要があります。古いテキストファイルを処理する場合は通常のifstream、新しいバイナリファイルを処理する場合は新しい「iBinFile」タイプです。私が思いつくことができる唯一の解決策は、2つの異なるコードを用意することです。1つは古いタイプ用で、もう1つは新しいタイプ用です。これらは入力ファイルストリームタイプを除いて同一です。

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::ostreamstd::basic_ios<char>streambufstreambuf

于 2013-02-14T19:12:01.980 に答える