basic_istream::getlineは、1行ごとに指定のバッファに読み込む。
basic_istream::getline - cpprefjp C++日本語リファレンス
よく見ると、char型などの文字配列のバッファには対応してるが、stringオブジェクトには対応してない模様。
となると、バッファを超えた時どうなるか。
fin.getlineの戻り値はfinの参照なので、finがtrueの時は読み込めたということ。
バッファサイズを6にしたので、5文字までは入るが、6文字だとどうなるか。
$ ls basic_istream basic_istream.cpp test.txt $ vi test.txt $ cat test.txt ABC DEF GHI JKL MNO $ vi basic_istream.cpp $ g++ basic_istream.cpp -o basic_istream $ ./basic_istream buf = [ABC] buf = [DEF] buf = [GHI] buf = [JKL] buf = [MNO] EOF fail $
すべての行が5文字以下なので、すべて読み込んでから、最終的にEOFにたどり着いて、failにもなっている。
まあ、EOFまで来ているので問題はない。
$ vi test.txt $ cat test.txt ABC DEF GHIXYZ JKL MNO $ ./basic_istream buf = [ABC] buf = [DEF] fail $
この場合、3行目が5文字を超えるので、そこでfailになってしまう。
EOFじゃないので、途中で終了したとわかる。
これを何とかするには、無理矢理続きを読み込ませるなどの方法もあるが、stringを使える方法にした方がいい。
Sample/cpp/basic_istream/getline/src/basic_istream at master · bg1bgst333/Sample · GitHub