3 回答
TA贡献1786条经验 获得超13个赞
来自文档:“ReadString 读取直到输入中第一次出现 delim,返回一个包含数据的字符串,直到并包括分隔符。”
因此,我建议您使用扫描仪,它可以像您期望的那样处理这种情况:
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lineStr := scanner.Text()
num, _ := strconv.Atoi(lineStr)
fmt.Println(lineStr, num)
}
TA贡献1812条经验 获得超5个赞
引用bufio.Reader.ReadString的文档(强调我的):
ReadString 读取直到输入中第一次出现 delim ,返回一个包含数据的字符串,直到并包括 delimiter。
现在,strconv.ParseInt的文档
ParseInt 返回的错误具有具体类型 *NumError 并包括 err.Num = s。如果 s 为空或包含无效数字,则 err.Err = ErrSyntax 返回值为 0
您的问题是该ReadString方法还返回\n终止该行的 ,这是该ParseInt函数的无效字符。
您可以使用以下代码段检查真正的错误
i, err := strconv.ParseInt(line, 10, 64)
if err != nil {
switch err.(*strconv.NumError).Err {
case strconv.ErrSyntax:
fmt.Println("syntax error")
case strconv.ErrRange:
fmt.Println("out of range value")
}
}
建议:用于strings.TrimSpace清理您的输入。
TA贡献1804条经验 获得超2个赞
如果您查看文档,ReadString
您会注意到string
返回的将包含分隔符(在您的情况下\n
)。
ReadString 读取直到输入中第一次出现 delim 为止,返回一个包含数据的字符串,直到并包括分隔符。
并且因为读取 10 后的行长度为 4,所以我假设这些行由\r\n
. 删除它的最简单方法是使用其中一个Trim
函数(如TrimSpace)。
- 3 回答
- 0 关注
- 322 浏览
添加回答
举报