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);
これで、空白文字にもイテレータを通してアクセスできるようになりました。
この操作は、イテレータを作成し終わった後でも、作成前でも大丈夫です。イテレータ経由で値をアクセスするときに、このフラグがリセットされている必要があります。
[ もどる ]