这似乎几乎是正确的,但是它在换行符上令人窒息。最好的方法是什么?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)
}
- 2 回答
- 0 关注
- 188 浏览
添加回答
举报
0/150
提交
取消