我正在处理一个包含整数列表作为字符串的输入文件
10
..
我选择使用ReadString('\n')方法
逐行阅读以下代码
line, error := inputReader.ReadString('\n')
lineStr := string(line)
控制台输出(长度和值)
lineStr %v 4
lineStr %v 10
lineStr长度为“4”,可能是因为符文编码。
然后我尝试了几种方法将其转换为简单整数,但没有成功。
练习1
num, _ := strconv.ParseUint(lineStr, 0, 64)
输出数字0(应为10)
练习2
num, _ := strconv.Atoi(lineStr)
输出数字0(应为10)
实例3
num, _ := strconv.Atoi("10")
输出数量为10(ok)
实例4
num, _ := strconv.ParseUint("10", 0, 64)
输出数量为10(ok)
文字中的字符串是可以的,但文件中的字符串不起作用,有什么问题?
提前致谢
答案 0 :(得分:3)
从文档中:“ReadString读取直到输入中第一次出现delim,返回包含数据的字符串,包括分隔符。”
因此,我建议您使用扫描仪,它可以像您期望的那样处理这种情况:
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lineStr := scanner.Text()
num, _ := strconv.Atoi(lineStr)
fmt.Println(lineStr, num)
}
答案 1 :(得分:1)
如果您查看ReadString
的文档,您会注意到返回的string
将包含分隔符(在您的情况下为\n
)。
ReadString读取直到输入中第一次出现delim, 返回包含数据的字符串,包括 分隔符。
并且因为读取10之后的行的长度是4,我将假设这些行由\r\n
分隔。删除它的最简单方法是使用其中一个Trim
函数(如TrimSpace)。
答案 2 :(得分:1)
引用bufio.Reader.ReadString的文件(强调我的):
的文档ReadString读取直到输入中第一次出现delim,返回一个包含数据的字符串,包括分隔符。
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
清理输入。