golang:逐行读取文本文件

时间:2015-03-11 10:16:05

标签: string file go int

我正在处理一个包含整数列表作为字符串的输入文件

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)

文字中的

字符串是可以的,但文件中的字符串不起作用,有什么问题?

提前致谢

3 个答案:

答案 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,返回一个包含数据的字符串,包括分隔符

现在,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清理输入。