3 回答
TA贡献1784条经验 获得超2个赞
你忽略了它的返回值,scanner.Scan()
它bool
表明你是否已经到达终点。
具体来说:
当扫描停止时,它返回 false,无论是到达输入的末尾还是错误。Scan返回false后,Err方法会返回扫描过程中发生的任何错误,除非是io.EOF,Err会返回nil。
所以你需要继续scanner.Scan()
循环运行,直到它返回false,然后检查.Err()
以确保你没有因为非EOF错误而停止扫描。
TA贡献1789条经验 获得超8个赞
这段代码的主要问题是scanner.Scan的返回值不是true扫描完成了,而是true扫描没有完成。
在我们解决这个问题的同时,让我们整理另一件事,因为您不需要使用
if done == true
但可以简单地做
if done
另外,请记住done = Scanner.Text(), 和作为终止条件,我们可以很好地整理代码:
for scanner.Scan() { // This does what you want, looping until scanner
// is no longer true.
buffer.WriteString(scanner.Text())
}
if err := scanner.Err(); err != nil { // Let's hold on to err...
log.Fatalf("Error scanning input: %s", err) // and use it here.
}
您可以丢弃很多行,并且只在循环结束时检查 Err() 一次。无需使用中断。
希望这对您有用,如果您需要其他东西,请给我留言。
编辑:还有两件事需要注意。
1)bufio.Scanner.Scan()将吃掉你所有的分隔符。也许没关系,或者您可能想继续将它们重新添加进去。
2)bufio.Scanner.Scan()如果您的 SplitFunc 错误,或者有人为您的 SplitFunc 制作了糟糕的输入,则bytes.Buffer.WriteString()可能会发生恐慌,如果缓冲区太大,则可能会发生恐慌。如果您在生产系统中使用这些,请确保以任何有意义的方式处理这些恐慌。
TA贡献1827条经验 获得超7个赞
您可以这样做而不是使用Scanner...
reader := bufio.NewReaderSize(os.Stdin, 65536)
line, isPrefix, err := reader.ReadLine()
编写一个辅助函数来继续阅读,直到读完一行...
func ReadLine(reader *bufio.Reader) (string, error) {
result := ""
for {
line, isPrefix, err := reader.ReadLine()
if err != nil {
return result, err
}
result += string(line)
if !isPrefix {
return result, nil
}
}
}
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报