go - 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]
[]
[]
我不知道为什么会这样。我怀疑这与多次打开标准输入有关,但我似乎找不到任何(易于访问的)文档来告诉我扫描仪超出范围时究竟会发生什么。
得知有一些更惯用的方法可以实现上述代码试图做的事情,我不会感到惊讶,但我很好奇为什么这段代码不起作用。
有人可以评论为什么我没有看到预期的行为吗?
谢谢,
解决方案
你不能那样做。关键bufio
在于它是缓冲的I/O。您Scanner
可能已经从标准输入消耗了任何数量的数据,超出了您要求的单行数据,并将其保存在自己的缓冲区中。该数据不会“放回”到标准输入中。如果你在Scanner
没有将第一个读到 EOF 的情况下创建一个新的,你将得到不可预测和无用的结果。您需要使用单个Scanner
,而不是不断制作新的。或者,如果逐行阅读不是您唯一想做的事情,那么使用 abufio.Reader
而不是 a可能会更好Scanner
。
推荐阅读
- postgresql - Sequelize:查询将字符串数组作为字符串返回,而不是作为字符串数组?
- vue.js - 选中 Vue Js 中的取消选中复选框
- ruby-on-rails - 如何阻止 webpacker 按需重建?
- django - 如何使 Django 对 405 Method Not Allowed 的警告静音
- java - 无法更改 parallelStream().forEach() 中的项目值?
- python - 如何使用 AWS 实例在 Windows IIS 中部署 django Web 应用程序?
- makefile - [Microchip][Mplab X IDE v5.35] Makefile-default.mk build source时出现问题
- azure - 如何使用 azure CLI 检查 azure 资源是否已在使用?
- python - pytorch中的autograd可以处理同一模块中层的重复使用吗?
- git - 为什么 github 有一个 pull request 号?