6.2 簡単な例
次に、抽象基底クラス RWvostream と RWvistream を通して、RWbostream と RWbistream を用いる簡単な例を示します。
#include <rw/bstream.h>
#include <rw/cstring.h>
#include <fstream.h>
#ifdef __BORLANDC__
# define MODE ios::binary // 1
#else
# define MODE 0
#endif
void save(const RWCString& a, RWvostream& v){
v << a; // 仮想出力ストリームに保存する
}
RWCString recover(RWvistream& v) {
RWCString dupe;
v >> dupe; // 仮想入力ストリームから復元する
return dupe;
}
main(){
RWCString a("A string with\ttabs and a\nnewline.");
{
ofstream f("junk.dat", ios::out|MODE); // 2
RWbostream bostr(f); // 3
save(a, bostr);
} // 4
ifstream f("junk.dat", ios::in|MODE); // 5
RWbistream bistr(f); // 6
RWCString b = recover(bistr); // 7
cout << a << endl; // 2 つの文字列を比較する // 8
cout << b << endl;
return 0;
}
出力:
A string with tabs and a newline. A string with tabs and a newline.
関数 save(const RWCString& a, RWvostream& v) の役目は、文字列 a を仮想出力ストリーム v に保存することです。関数 recover(RWvistream&) はその結果を読み出します。これらの関数は、文字列の格納に使用される最終形式には関知しません。次に各行に対する注釈を示します。
- //1-//2
- この 2 行では、ファイル junk.dat に対してファイル出力ストリーム f が作成されます。多くの PC コンパイラのファイルオープン時のデフォルトモードは text であるため、DOS の自動改行変換を避けるために明示的にフラッグ ios::binary を使用しなければなりません。[1]
- //3
- この行で、f から RWbostream が作成されます。
- //4
- この文は { … } で囲まれているので、f のデストラクタがここで呼び出されます。これにより、ファイルを閉じます。
- //5
- ファイルを再び入力のために開きます。
- //6
- f から RWbistream が作成されます。
- //7
- 文字列がファイルから読み出されます。
- //8
- 最後に、オリジナルの文字列と読み出された文字列を比較のために出力します。
このプログラムは、fstream クラスを使って簡略化することができます。fstream クラスは、出力と入力のために ofstream と ifstream を多重継承します。結果を読み込む前に、ファイルの先頭を見つける必要があります。seekg() の早期実装は、信頼性が証明されていないので、上記例ではこの手段がとられていません。
注釈
- ^ 多くの PC コンパイラでは、 ios::binary フラッグ付きでファイルが開かれていないかぎり、ostream::write() および istream::read() はテキスト変換を実行します。