29項 1文字ごとの入力にはistreambuf_iteratorの使用を考えよう

1文字ごとの入力にはistreambuf_iteratorの使用を考えよう



stringオブジェクトにテキストファイルをコピーする、次のコードを考えます。

ifstream inputFile("test.txt");
inputFile.unsetf(ios::skipws);		//空白も読み込む

istream_iterator<char> databegin(inputFile);
istream_iterator<char> dataEnd;
string fileData(databegin, dataEnd);

istream_iteratorは、入力ストリームのoperator>>で読み込みを行います。
operator>>は呼び出しごとに複雑な処理を行うため、無駄なコストがかかります。


istreambuf_iteratorを使えば、無駄なコストを省けます。

ifstream inputFile("test.txt");

istreambuf_iterator<char> databegin(inputFile);
istreambuf_iterator<char> dataEnd;
string fileData(databegin, dataEnd);

istreambuf_iteratorはoperator>>を使わず、バッファに直接アクセスします。
そのため、skipwsをセットしなくても空白を読み込みます。