gpt4 book ai didi

go - 第二个bufio.Scanner for stdin不读取任何内容

转载 作者:行者123 更新时间:2023-12-01 22:38:09 24 4
gpt4 key购买 nike

使用Go和bufio.Scanner从stdin读取时遇到一些麻烦。

假设我有这样的输入

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]
[]
[]

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

了解到有更多惯用的方法可以实现上述代码想要做的事情,我不会感到惊讶,但是我对为什么此代码不起作用感到非常好奇。

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

谢谢,

最佳答案

你不能那样做。 bufio的要点是它是缓冲的I / O。您的Scanner可能已经消耗了stdin中的大量数据(超出了您要求的单行),并将其保存在自己的缓冲区中。该数据不会“放回” stdin。如果您在不阅读EOF的情况下编写新的Scanner,则将获得不可预测且无用的结果。您只需要使用一个Scanner,而不要继续制作新的。或者,如果不是唯一要逐行阅读的内容,则最好使用bufio.Reader而不是Scanner

关于go - 第二个bufio.Scanner for stdin不读取任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com