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

这似乎几乎是正确的,但是它在换行符上令人窒息。最好的方法是什么?


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"

    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 1

n 1

n 1

n 0

[3.25 -12.6 33.7]

更新:


请参阅下面来自@Atom的答案。我发现另一种方法是在错误是EOF时中断,否则就忽略它。我知道这只是黑客,但我控制源代码。


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

    if err == os.EOF { break }

    if err != nil { continue }


千巷猫影
浏览 190回答 2
2回答

莫回无

如果您输入的只是一堆行,每行的浮点数用空格隔开,那么一次从文件中读取一行可能会更容易,在该行上运行Sscanf(假设每行的浮点数为固定的)。但是,在您的示例中有一些有效的方法-可能有一种方法可以使它更有效。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"    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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go