違い
("bufio".Reader) ReadString('\n')
- 改行をカットしない
("bufio".Scanner) Scan()
- 改行をカットする
改行コードのない最終行の扱い
最後の行が abcd
(EOF) というテキストの場合
("bufio".Reader) ReadString('\n')
"abcd",io.EOF
という戻り値となる
("bufio".Scanner) Scan()
Text()
は "abcd" という戻り値を返し、その次のScan()
が false になる
Scanner の方は定番である
for sc.Scan() {
line := sc.Text()
fmt.Println(line)
}
という書き方で問題ないが、Reader の方は
for{ line,err := r.ReadString('\n') if err != nil { break } fmt.Print(line) }
だと、最後の行が抜けてしまう。
for{ line,err := r.ReadString('\n') fmt.Print(line) if err != nil { break } }
と書かないといけない。こう書くと Scanner の方が常に正しいように思われるが、Scanner は最終行の改行の有無がわからないという問題がある。