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 に一度詰めて、それから整形という風になるだろう。