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

哪个扫描用于读取字符串中的浮点数?

哪个扫描用于读取字符串中的浮点数?

Go
千巷猫影 2021-05-01 14:08:41
这似乎几乎是正确的,但是它在换行符上令人窒息。最好的方法是什么?package mainimport (    "fmt"    "strings")func main() {    var z float64    var a []float64    // \n gives an error for Fscanf    s := "3.25 -12.6 33.7 \n 3.47"    in := strings.NewReader(s)    for {        n, err := fmt.Fscanf(in, "%f", &z)        fmt.Println("n", n)        if err != nil {            break        }        a = append(a, z)    }    fmt.Println(a)}输出:n 1n 1n 1n 0[3.25 -12.6 33.7]更新:请参阅下面来自@Atom的答案。我发现另一种方法是在错误是EOF时中断,否则就忽略它。我知道这只是黑客,但我控制源代码。    _, err := fmt.Fscanf(in, "%f", &z)    if err == os.EOF { break }    if err != nil { continue }
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

如果您输入的只是一堆行,每行的浮点数用空格隔开,那么一次从文件中读取一行可能会更容易,在该行上运行Sscanf(假设每行的浮点数为固定的)。但是,在您的示例中有一些有效的方法-可能有一种方法可以使它更有效。


package main


import (

    "fmt"

    "strings"

)


func main() {

    var z float64

    var a []float64

    // \n gives an error for Fscanf

    s := "3.25 -12.6 33.7 \n 3.47"

    for _, line := range strings.Split(s, "\n") {

        in := strings.NewReader(line)

        for {

            n, err := fmt.Fscanf(in, "%f", &z)

            fmt.Println("n", n)

            if err != nil {

                fmt.Printf("ERROR: %v\n", err)

                break

            }

            a = append(a, z)

        }

    }

    fmt.Println(a)

}


查看完整回答
反对 回复 2021-05-10
  • 2 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

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