这似乎几乎是正确的,但它在换行线上窒息.最好的方法是什么?
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.Fscan和fmt.Fscanf是在的情况下,fmt.Fscan换行算作空间.后一个函数(带有格式字符串)不会将换行视为空格,并且需要输入中的换行符以匹配格式字符串中的换行符.
带有格式字符串的函数可以更好地控制输入的形式,例如当您需要扫描%5f或时%10s.在这种情况下,如果输入包含换行符并且它实现了接口io.RuneScanner,则可以使用该方法ReadRune查看下一个字符,UnreadRune如果它不是空格或换行符,则可以选择将其读取.
| 归档时间: |
|
| 查看次数: |
1692 次 |
| 最近记录: |