クラス: 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 はデストラクタでファイルディスクリプタを閉じる。