Contents Up Previous Next

wxStreams の概要

クラス: wxStreamBase, wxStreamBuffer, wxInputStream, wxOutputStream, wxFilterInputStream, wxFilterOutputStream

wxStream の目的

標準の C++ ストリームはいくつかのプラットフォームで問題を引き起こすことがあります: 大半はうまく動作しますが、例えばマルチスレッドの場合では多くの問題を抱えています。Borland のいくつかのコンパイラではまったく動作しませんし、Linux で iostream を使用すると異なる Linux ディストリビューション間でバイナリ互換性を保つことは不可能になります。

そのため、wxStreams が wxWidgets に追加されました。これにより、libg++ の特定のバージョンに依存することなく、対応するすべてのプラットフォームで確実にアプリケーションをコンパイルし、実行することができます。

wxStreams は主となるふたつの部分に分けられます:

  1. コアクラス: wxStreamBase, wxStreamBuffer, wxInputStream, wxOutputStream, wxFilterIn/OutputStream
  2. "IO" クラス: wxSocketIn/OutputStream, wxDataIn/OutputStream, wxFileIn/OutputStream, ...

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