basic_istream::getline

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