Tools.h++ 7.0 クラスライブラリ・リファレンスマニュアル: RWAuditStreamBuffer

バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.

## RWAuditStreamBuffer

RWAuditStreamBuffer streambuf

### 形式

      #include <rw/auditbuf.h>
      #include <iostream.h>
      RWAuditStreamBuffer buf(arguments)
      ostream os(&buf); // どの種類の ostream または istream
      istream is(&buf); // にも使用できる

### 説明

  クラス RWAuditStreamBuffer はストリームを作成するのに使用され、ストリーム作成後に RWAuditStreamBuffer インスタンスはストリームを通過するすべてのバイトをカウントします。関数ポインタで構築した場合、RWAuditStreamBuffer は、バイトがストリームを通過するたび、その関数を呼び出します。カウント機能は、RWFile でしか利用できない RWCollectable メソッド `recursiveStoreSize()` と同等の機能をストリームに提供します。

### 持続性

  なし

### 簡単な例

      #include <rw/auditbuf.h>
      #include <rw/bstream.h>
      #include <rw/pstream.h>
      #include <iostream.h>
      int main() {
        RWCollectable ct;
        fillCollectable();  // なんらかの方法でコレクションを作る
        RWAuditStreamBuffer bcounter, pcounter;
        RWbostream bcount(&bcounter); //ctor は streambuf ポインタをとる
        RWpostream pcount(&pcounter);
      //...
        bcount << ct;
        pcount << ct;
      cout  << "We just counted " << bcounter
            << " bytes from an RWbostream." << endl;
      cout  << "We just counted " << pcounter
            << " bytes from an RWpostream." << endl;
      return 0;
      }

### 関連クラス

  RWAuditStreamBuffer は、RWvostream または RWvistream から派生した strstream、ifstream、ofstream など、どのようなストリームに対する streambuf としても使用できます。

### 大域 Typedef

      typedef void (*RWauditFunction)(unsigned char, void*);

    バッファで処理する各文字をカウントする以上のことを行いたい場合は、コンストラクタに `RWauditFunction` を提供することができます。この関数の最初のパラメータは、ストリームによって提供されるバイトです。2 番目のパラメータは、RWAuditFunction で操作されるカウンタのアドレスです。

### 公開コンストラクタ

      RWAuditStreamBuffer(RWauditFunction=0, void*=0);

    `streambuf` として RWAuditStreamBuffer インスタンスを持つ `ostream` にバイトが渡されるたびに検査とカウントを行うためにだけ使用できる、新しい RWAuditStreamBuffer を作成します。これは、バイトをストリームに転送したり、ストリームからバイトを受け取ることはありません。コンストラクタの第 2 引数として、バイトカウントの記憶領域を指定できます。この引数はオプションです。

      RWAuditStreamBuffer(istream&, RWauditFunction=0, void*=0);

    作成されている `istream` から、`streambuf` として RWAuditStreamBuffer インスタンスを持つ `istream` にバイトを渡す、新しい RWAuditStreamBuffer を作成します。一般的な用途は、RW`vistream` から派生したストリームを通して、ファイルから入力されるバイトをカウントまたは検査することです。コンストラクタの第 2 の引数として、バイトカウントの記憶領域を指定できます。この引数はオプションです。

      RWAuditStreamBuffer(iostream&, RWauditFunction=0, void*=0);

    作成されている `iostream` と、`streambuf` として RWAuditStreamBuffer インスタンスを持つ `istream` との間でバイトを授受する、新しい RWAuditStreamBuffer を作成します。一般的な用途は、交換データを格納し取り出すのに使用されるファイルとの間で転送されるバイトをカウントまたは検査することです。コンストラクタの第 2 引数として、バイトカウントの記憶領域を指定できます。この引数はオプションです。

      RWAuditStreamBuffer(ostream&, RWauditFunction=0, void*=0);

    作成されている `ostream` に、`streambuf` として RWAuditStreamBuffer インスタンスを持つ `ostream` からバイトを渡す、新しい RWAuditStreamBuffer を作成します。一般的な用途は、RWvostream から派生したストリームを通して、ファイルに出力されるバイトをカウントまたは検査することです。コンストラクタの第 2 引数として、バイトカウントの記憶領域を指定できます。この引数はオプションです。

      RWAuditStreamBuffer(streambuf*, RWauditFunction=0, void*=0);

    作成されている `ostream` に、`streambuf` として RWAuditStreamBuffer インスタンスを持つ `ostream` からバイトを渡す、新しい RWAuditStreamBuffer を作成します。一般的な用途は、RWvostream から派生したストリームを通して、ファイルに出力されるバイトをカウントまたは検査することです。コンストラクタの第 2 引数として、バイトカウントの記憶領域を指定できます。この引数はオプションです。

### 公開デストラクタ

      virtual ~RWAuditStreamBuffer();

    コンパイラの種類によっては、仮想メソッドを持つクラスに仮想デストラクタがないと不都合があるため、空のデストラクタを提供しています。

### 公開メンバー演算子

      operator unsigned long();

    その時点までに確認したバイト数を提供します。

### 公開メンバー関数

      unsigned long
      reset(unsigned long value = 0);

    その時点までに確認したバイト数をリセットします。現在のカウントを返します。

### 拡張例

      #include <iostream.h>
      #include <fstream.h>
      #include <rw/auditbuf.h>
      #include <rw/pstream.h>
      #include <rw/cstring.h>
      void doCrc (unsigned char c, void* x) {
        *(unsigned char*)x ^= c;
      }

      int main() {
      if(1) { // 変数の寿命を制御するためのブロック
          unsigned char check = '\0';

          // 出力ストリームを作成する
          ofstream                            op("crc.pst");
          // CRC を実行する RWAuditStreamBuffer を作成する
          RWAuditStreamBuffer               crcb(op,doCrc,&check);
          // データを入れるための RWpostream を作成する
      RWpostream                           p(&crcb);

          // ここで、ストリームに適当なデータをいくつか送る
          p << RWCString("The value of Tools.h++ is at least ");
          p << (int)4;
          p << RWCString(" times that of the next best library!\n") ;
          p << RWCString("Pi is about ") << (double)3.14159 << '.';

          // 最後に、ストリーム自体に合計を保存する
      p << (unsigned int)check; // 保存後に、チェックを変更する

          // 試しに、いくつかの統計情報を出力する
          cout << "We just saved " << crcb
               << " bytes of data to the file." << endl;
          cout << "The checksum for those bytes was " <<check << endl;
      } // ブロックの終わり

        // ここで、データを読み戻して、正しく保存されているか確かめる
        unsigned char check = '\0';

        // instream を作成する
        ifstream                            ip("crc.pst");

        // CRC を実行する RWAuditStreamBuffer を作成する
        RWAuditStreamBuffer               crcb(ip,doCrc,&check);

        // バイトを解釈するための RWpistream を作成する
        RWpistream                           p(&crcb);

        RWCString first, mid1, mid2;
        int value;
        double pi;
        char pnc;
        unsigned int savedCRC;
        unsigned char matchCRC;
        // データを読み込む。検査合計はまだ読み込まないこと
        p >> first >> value >> mid1 >> mid2 >> pi >> pnc;
        // 検査合計を保存する
        matchCRC = check;
        // ここで、ファイルに保存されている検査合計を読み込んで、実行検査合計を変
        // 更しておくと安全である
      p >> savedCRC;
        if(savedCRC != matchCRC) {
          cout << "Checksum error. Saved CRC: " << savedCRC
               << " built CRC: " << matchCRC << dec << endl;
        }
        else {
          cout << "The message was: " << endl;
          cout << first << value << mid1 << mid2 << pi << pnc << endl;
        }
        // 試しに、いくつかの統計情報を出力する
        cout  << "We just read " << crcb
              << " bytes of data from the file." << endl;
        cout  << "The checksum was " << matchCRC << flush;
        cout  << " and the saved checksum was " << savedCRC << endl;
      return 0;
      }