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

golang: read text file line by line of int strings

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

10
..

我选择用ReadString('\n')方法逐行阅读

下面的代码

line, error := inputReader.ReadString('\n')
lineStr := string(line)

控制台输出(长度和值)

lineStr %v 4
lineStr %v 10

lineStr 的长度为“4”,可能是因为符文编码。

然后我尝试了几种方法将其转换为简单整数,但都没有成功。

Ex1

num, _ := strconv.ParseUint(lineStr, 0, 64)

输出一个数字 0(应该是 10)

Ex2

num, _ := strconv.Atoi(lineStr)

输出一个数字 0(应该是 10)

Ex3

num, _ := strconv.Atoi("10")

输出数字 10(确定)

Ex4

num, _ := strconv.ParseUint("10", 0, 64)

输出数字 10(确定)

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

提前致谢

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

ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.

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

来自文档:"ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter."

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

scanner := bufio.NewScanner(file)
for scanner.Scan() {
    lineStr := scanner.Text()
    num, _ := strconv.Atoi(lineStr)
    fmt.Println(lineStr, num)
}

引用 bufio.Reader.ReadString 的文档(强调我的):

ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.

现在,strconv.ParseInt

的文档

The errors that ParseInt returns have concrete type *NumError and include err.Num = s. If s is empty or contains invalid digits, err.Err = ErrSyntax and the returned value is 0

你的问题是 ReadString 方法 return 也是终止该行的 \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 清理您的输入。