std::istream をイテレータを使って読み込む - C++ プログラミング

PROGRAM


std::istream をイテレータを使って読み込む

std::stream_iterator<> クラスを使うと、std::basic_istream<> 系列の入力ストリームを イテレータ に変換してアクセスできるようになります。

たとえば std::istringstream 型の stream であれば、実際の定義は std::basic_istringstream<char> なので、std::stream_iterator<> も <char> を指定して、次のようにして開始位置と終了位置を示すイテレータをそれぞれ用意します。

// 開始イテレータと終了イテレータを用意します。

std::istream_iterator<char> iteratorBegin(stream);

std::istream_iterator<char> iteratorEnd();

開始位置を示すイテレータには、コンストラクタで入力ストリームを指定します。

終了位置を示すイテレータは、引数無しのコンストラクタを使って生成します。

 

このようにしたら、普通のイテレータと同じようにストリームの内容を順次処理することができます。

// 例えば、イテレータを使って文字を順次辿る場合は次のようにします。

for (std::istream_iterator<char> iterator = iteratorBegin; iterator != iteratorEnd; ++iterator)

{

// イテレータが指す位置の文字を取得します。ただし既定では空白文字は読み飛ばされるようです。

char word = *iterator;

 

}

このとき、イテレータが読み進められる度に、std::istream_iterator のコンストラクタで指定した入力ストリームの読み込み位置も移動されます。

イテレータでの処理の途中で入力ストリームを(ignore 関数を呼び出したりなどして)直接操作した場合は、その操作で移動された新しい位置をイテレータが示すようなので、両方を併用して処理を進めることも可能です。

 

std::istream_iterator で空白文字を読み込むようにする

std::istream_iterator<> を通して入力ストリームを読み込んだ場合、空白文字はスキップされる様子です。

空白文字も 1 文字として読み込みたい場合は、std::istream_iterator<> に設定する入力ストリームの skipws フラグをオフにする必要があります。

// 入力ストリームの skipws フラグをオフにします。

stream.unsetf(std::ios::skipws);

これで、空白文字にもイテレータを通してアクセスできるようになりました。

この操作は、イテレータを作成し終わった後でも、作成前でも大丈夫です。イテレータ経由で値をアクセスするときに、このフラグがリセットされている必要があります。


[ もどる ]