使用Golang从stdin读取整数,直到EOF并报告格式错误

12
nums := make([]int, 0)
{
    var d int
    for {
        _, err := fmt.Scan(&d)
        if err != nil {
            break
        }

        nums = append(nums, d)
    }
}

这个代码可以从标准输入中读取整数。但是如果标准输入看起来像是1 2 3 f4 5nums将最终变成[1 2 3],而不会报告任何错误。

有什么最好的处理方法吗?(即,我希望从fmt.Scan获得EOF以使循环静默退出,但所有其他错误都应报告)。

编辑io.EOF就是我需要的——我没有在http://golang.org/pkg/fmt/中找到它的文档。

nums := make([]int, 0)
{
    var d int
    for {
        _, err := fmt.Scan(&d)
        if err != nil {
            if err != io.EOF {
                log.Fatal(err)
            }
            break
        }

        nums = append(nums, d)
    }
}
1个回答

16

当你得到一个坏的数字时,你可以这样做 - 读取下一个用空格分隔的内容。在出现错误时设置标志或保留错误列表以在最后报告。

(Playground链接)

package main

import (
    "bytes"
    "fmt"
    "io"
)

func main() {
    in := bytes.NewBufferString("1 2 3 f4 5")
    nums := make([]int, 0)
    var d int
    for i := 0; i < 10; i++ {
        _, err := fmt.Fscan(in, &d)
        if err == io.EOF {
            break
        }
        if err != nil {
            var s string
            _, err := fmt.Fscan(in, &s)
            if err != nil {
                break
            }
            fmt.Printf("Skipping bad number: %q\n", s)
        } else {
            nums = append(nums, d)
        }
    }
    fmt.Printf("nums = %v\n", nums)
}

打印哪个

Skipping bad number: "f4"
nums = [1 2 3 5]

1
你的回答超出了我的想象——我只需要 err == io.EOF。也就是说,我不关心跳过格式错误的数字,我只希望在这种情况下它不会悄悄地继续执行。 - alecbz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接