ifstream での >> 演算子の振る舞い
久々の更新になってしまった。
C++ でファイル読み込みがしたかったら ifstream を使うのが普通。
ググると出てくるサンプルコードにはgetline()
による方法が多い気がする。
けど、オーバーロードされた>>
演算子を使うという方法もある。
ただ、その振る舞いに謎な部分があったのでメモしておく。
結論から言うと、>>
でファイル読み込みするときは
1個以上の連続したスペース、タブ、改行は1つのデリミタだと見なされるので注意すべし
ということだ。
>>
の用例としては
ifstream ifs("input.dat"); while(!ifs.eof()) { string word; ifs >> word; // まあいろんな処理、例えば cout << word << endl; }
といった感じになる。ここに
15.250 92.000 15.350 90.000 15.450 102.00
みたいな、多数のスペースと改行で区切られたデータを入れるとどうなるのか?実行結果は
15.250 92.000 15.350 90.000 15.450 102.00
となる。このサンプルデータではレコードの区切りはスペースと改行だけだが、タブ文字が入っている場合でも同様。
ここで示したようなデータなら、この動作は好ましい。
ただ、空のレコードが存在する場合などは困ってしまう。そんな時はgetline()
で string に一度詰めて、それから整形という風になるだろう。