クラス: wxStreamBase, wxStreamBuffer, wxInputStream, wxOutputStream, wxFilterInputStream, wxFilterOutputStream
wxStream の目的
標準の C++ ストリームはいくつかのプラットフォームで問題を引き起こすことがあります: 大半はうまく動作しますが、例えばマルチスレッドの場合では多くの問題を抱えています。Borland のいくつかのコンパイラではまったく動作しませんし、Linux で iostream を使用すると異なる Linux ディストリビューション間でバイナリ互換性を保つことは不可能になります。
そのため、wxStreams が wxWidgets に追加されました。これにより、libg++ の特定のバージョンに依存することなく、対応するすべてのプラットフォームで確実にアプリケーションをコンパイルし、実行することができます。
wxStreams は主となるふたつの部分に分けられます:
wxStreamBase はストリームの基底クラスです。このクラスは例えば OnSysRead、OnSysWrite、OnSysSeek、OnSysTell などの API を定義しています。これらのクラスは実際には "IO" クラスで実装されています。wxInputStream と wxOutputStream はこのクラスを継承しています。
wxStreamBuffer は wxStreamBase 用のキャッシュマネージャです: このクラスはストリームに関連付けられたストリームバッファを管理します。ひとつのストリームは複数のストリームバッファを持つことができますが、ストリームは常にひとつの自動初期化済みのストリームバッファを持ちます。
wxInputStream は読み取り専用ストリームの基底クラスです。このクラスでは Read、SeekI (I は Input を表します) と、読み取りや入出力に関するすべての関数を実装しています。wxOutputStream も同じことを行いますが、こちらは書き込み専用のストリーム用です。
wxFilterIn/OutputStream はフィルタリング用の基底クラスです。ストリームのフィルタリングとは、システムコールは行いませんが、渡されたデータをフィルタリングし、他のストリームへ引き渡すストリームを意味します。例えば、wxZLibInputStream はインラインでストリームを展開します。
"IO" クラスはストリームの特定の部分を実装しています。wxStreamBuffer に基づく wxMemoryIn/OutputStream の場合は何も行いません。また、この実装は単純に本当のシステムコール (read(...)、write(...) など) に関連付けられています。
一般的な使用方法の例
使用方法は単純です。例として wxFileInputStream のサンプルコードを以下に示します:
...
// コンストラクタではストリームバッファの初期化と
// ファイル名に関連付けられたファイルディスクリプタのオープンが行われる。
wxFileInputStream in_stream("the_file_to_be_read");
// Ok、データを読み込む ... nb_datas はバイト単位で表す。
in_stream.Read(data, nb_datas);
if (in_stream.LastError() != wxSTREAM_NOERROR) {
// おっと、何か良くないことが起こった。
// 完全な一覧は wxStreamBase のドキュメントを参照のこと。
}
// このようにインラインにすることもできる。
if (in_stream.Read(data, nb_datas).LastError() != wxSTREAM_NOERROR) {
// 処理を行なう。
}
// また、バッファへ実際に書き込んだバイト数を取得することもできる。
size_t really_read = in_stream.LastRead();
// Ok、ストリームの先頭へ移動する。SeekI はストリームの先頭から数えた
// 最後の位置を返却する。
off_t old_position = in_stream.SeekI(0, wxFromBeginning);
// 現在位置はどこ?
off_t position = in_stream.TellI();
// wxFileInputStream はデストラクタでファイルディスクリプタを閉じる。