为了账号安全,请及时绑定邮箱和手机立即绑定

golang:逐行读取 int 字符串的文本文件

golang:逐行读取 int 字符串的文本文件

Go
喵喔喔 2021-09-20 20:40:00
我正在处理一个包含整数列表作为字符串的输入文件10..我选择使用ReadString('\n')方法逐行阅读以下代码line, error := inputReader.ReadString('\n')lineStr := string(line)控制台输出(长度和值)lineStr %v 4lineStr %v 10lineStr 长度为“4”,可能是因为符文编码。然后我尝试了几种方法将它转换为简单的整数,但没有成功。例1num, _ := strconv.ParseUint(lineStr, 0, 64)输出数字 0(应该是 10)例2num, _ := strconv.Atoi(lineStr)输出数字 0(应该是 10)例3num, _ := strconv.Atoi("10")输出数量为 10 (ok)Ex4num, _ := strconv.ParseUint("10", 0, 64)输出数量为 10 (ok)文字中的字符串没问题,但文件中的字符串不起作用,有什么问题?提前致谢
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

来自文档:“ReadString 读取直到输入中第一次出现 delim,返回一个包含数据的字符串,直到并包括分隔符。”


因此,我建议您使用扫描仪,它可以像您期望的那样处理这种情况:


scanner := bufio.NewScanner(file)

for scanner.Scan() {

    lineStr := scanner.Text()

    num, _ := strconv.Atoi(lineStr)

    fmt.Println(lineStr, num)

}


查看完整回答
反对 回复 2021-09-20
?
ABOUTYOU

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清理您的输入。


查看完整回答
反对 回复 2021-09-20
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

如果您查看文档,ReadString您会注意到string返回的将包含分隔符(在您的情况下\n)。

ReadString 读取直到输入中第一次出现 delim 为止,返回一个包含数据的字符串,直到并包括分隔符。

并且因为读取 10 后的行长度为 4,所以我假设这些行由\r\n. 删除它的最简单方法是使用其中一个Trim函数(如TrimSpace)。


查看完整回答
反对 回复 2021-09-20
  • 3 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信