## 2.3 ストリーム反復子

ストリーム反復子は、反復子演算を使用して既存の入力ストリームや出力ストリームにアクセスするために使用されます。入力ストリーム反復子では、反復子演算を使用して入力ストリームを読み取ることが可能です。同様に、出力ストリーム反復子は、反復子演算が実行されるときに出力ストリームに書き込みます。

### 2.3.1 入力ストリーム反復子

入力反復子の節で説明したように、標準 C++ ライブラリは、クラス `istream_iterator` を介して入力ストリームを入力反復子にする機構を提供します。宣言の際には、4 つのテンプレートの引数は、要素の型、ストリームの文字型、特殊文字型、要素間の距離を測定する型です。後半の 2 つはデフォルトで `char_traits<charT` > と `ptrdiff_t` です。ほとんどの場合、デフォルト値が適切に動作します。`istream_iterator` のコンストラクタに提供される 1 つの引数が、アクセスされるストリームです。入力ストリーム反復子で (演算子 `>>` を使用して) `++` 演算子が呼び出されるたびに、ストリームから新しい値が読み取られ、格納されます。この値は、間接参照演算子 `*` を使用することによって利用可能となります。コンストラクタに提供される引数がない場合、`istream_iterator` によって作成される値は、終了反復子の値として使用することができます。たとえば、次のコードでは、整数値のファイルで最初の値 7 が検索されます。

    istream_iterator<int, char> intstream(cin), eof;
    istream_iterator<int, char>::iterator where =
             find(intstream, eof, 7);

入力ストリームの反復子によって示される要素は、ストリームで次の要素が要求されるまでの間だけ有効です。また、入力ストリーム反復子は入力反復子なので、要素にアクセスすることはできますが、代入によって変更することはできません。最後に、要素にアクセスできるのは一度だけで、移動できるのは順方向だけです。ストリームの内容を 2 回以上読み取るには、各パスに対してそれぞれ反復子を作成する必要があります。

### 2.3.2 出力ストリーム反復子

出力ストリーム反復子の機構は、入力ストリーム反復子と類似しています。値が反復子に割り当てられるたびに、演算子 `>>` を使用して、関連付けられた出力ストリームに書き込まれます。出力ストリーム反復子を作成するには、コンストラクタ付きの引数として関連付けられた出力ストリームを指定する必要があります。出力ストリームに書き込まれる値は、ストリーム `>>` 演算を認識しなくてはなりません。コンストラクタへの任意の 2 番目の引数は、値の間のセパレータとして使用される文字列です。 たとえば、次のコードはベクトルからすべての値を標準出力へコピーし、各値を空白文字で区切ります。

    copy (newdata.begin(), newdata.end(),
          ostream_iterator<int,char> (cout, " "));

入力ストリーム反復子や出力ストリーム反復子を標準 C++ ライブラリによって提供されるさまざまなアルゴリズムと組み合わせることによって、単純なファイル変換アルゴリズムを作成することができます。次の短いプログラムは標準入力から整数のファイルを読み取り、出現する値 7 をすべて削除し、残りの値を標準出力へコピーして各値を新しい行で区切ります。

    void main()
    {
       istream_iterator<int, char> input (cin), eof;
       ostream_iterator<int, char> output (cout, "\n");

       remove_copy (input, eof, output, 7);
    }

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月