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

tel*_*t99 1 go

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

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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

n 1
n 1
n 1
n 0
[3.25 -12.6 33.7]
Run Code Online (Sandbox Code Playgroud)

更新:

请参阅下面@Atom的答案.我找到了另一种方法,如果错误是EOF就会中断,否则只是忽略它.我知道,这只是一个黑客,但我控制着源头.

    _, err := fmt.Fscanf(in, "%f", &z)
    if err == os.EOF { break }
    if err != nil { continue }
Run Code Online (Sandbox Code Playgroud)

小智 5

如果仅解析浮点数,则可以使用fmt.Fscan(r io.Reader, a ...interface{})而不是fmt.Fscanf(r io.Reader, format string, a ...interface{}):

var z float64
...
n, err := fmt.Fscan(in, &z)
Run Code Online (Sandbox Code Playgroud)

之间的区别fmt.Fscanfmt.Fscanf是在的情况下,fmt.Fscan换行算作空间.后一个函数(带有格式字符串)不会将换行视为空格,并且需要输入中的换行符以匹配格式字符串中的换行符.

带有格式字符串的函数可以更好地控制输入的形式,例如当您需要扫描%5f或时%10s.在这种情况下,如果输入包含换行符并且它实现了接口io.RuneScanner,则可以使用该方法ReadRune查看下一个字符,UnreadRune如果它不是空格或换行符,则可以选择将其读取.