いくつかのレガシーコードにいくつかの新しい機能を追加しています。既存のコードは、テキストファイルからいくつかのデータを読み取ります。新しいバージョンでは、はるかに多くのデータを読み込んでバイナリファイルを使用したいと考えています。さらに、プログラムは同じ(外部)データファイルを使用して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を派生させている場合は、「>>」演算子を仮想化できますが、それが解決策であるかどうかはわかりません。