首页 > 解决方案 > stdin 的第二个 bufio.Scanner 不读取任何内容

问题描述

我在使用 Go 和bufio.Scanner.

假设我有这样的输入

1 5
2 3
4 5

我正在尝试通过调用此函数来读取每一行:

    func get_arg_multi_int(params *[]int) {
        var line string
        var scanner *bufio.Scanner = bufio.NewScanner(os.Stdin)

        if scanner.Scan() {

            line = scanner.Text()
            for _, x := range strings.Fields(line) {
                i, _ := strconv.Atoi(x)
                *params = append(*params, i)
            }

        }

        if err:= scanner.Err(); err != nil {
            fmt.Println(err)
        }
    }

在三个电话之后,get_arg_multi_int我希望params(每次)填充为:

[1, 5]
[2, 3]
[4, 5]

相反,我得到以下信息:

[1, 5]
[]
[]

我不知道为什么会这样。我怀疑这与多次打开标准输入有关,但我似乎找不到任何(易于访问的)文档来告诉我扫描仪超出范围时究竟会发生什么。

得知有一些更惯用的方法可以实现上述代码试图做的事情,我不会感到惊讶,但我很好奇为什么这段代码不起作用。

有人可以评论为什么我没有看到预期的行为吗?

谢谢,

标签: go

解决方案


你不能那样做。关键bufio在于它是缓冲的I/O。您Scanner可能已经从标准输入消耗了任何数量的数据,超出了您要求的单行数据,并将其保存在自己的缓冲区中。该数据不会“放回”到标准输入中。如果你在Scanner没有将第一个读到 EOF 的情况下创建一个新的,你将得到不可预测和无用的结果。您需要使用单个Scanner,而不是不断制作新的。或者,如果逐行阅读不是您唯一想做的事情,那么使用 abufio.Reader而不是 a可能会更好Scanner


推荐阅读