介绍
在Go语言中,有时需要从输入数据中读取格式化的数据,fmt包中的Fscanf函数可以帮助我们实现这一目标。Fscanf函数是Read和Scanf之间的折中,可以从字符串(例如来自网络)和文件中读取格式化的数据。
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
该函数从io.Reader中读取数据并进行格式化,将结果存储在提供的参数中。返回值n是读取的项目数量(例如,如果遇到了一个错误,将为0),err是读取时遇到的任何错误(EOF除外)。
函数格式
Fscanf函数的格式字符串与C语言函数scanf的格式字符串相似。以下是一些示例格式说明符:
字符串
%s 读取到第一个空格为止的字符串
%q 读取到第一个空格为止的字符串,并将结果更改为双引号引用的转义字符串
整数
%d 读取一系列数字字符(可能带负号)并将其解释为十进制整数
%x、%o 和 %b 读取数字并将其解释为十六进制、八进制和二进制整数
%v 读取一系列数字字符,并将其解释为所需的十进制、十六进制、八进制或二进制整数
浮点数
%f 读取由十进制符号、整数和小数点组成的浮点数
%g 读取任意浮点数
指针和宽度
%p 读取指针地址
%*d 忽略一个整数
%2d 读取两个数字而不是一个
使用方法
使用Fscanf函数从字符串中读取格式化的数据并赋值给变量,直到遇到指定分隔符。下面是使用Fscanf实现的一个例子,读取一组逗号分隔的浮点数:
package main
import (
"fmt"
"strings"
)
func main() {
input := "0.1, 0.2, 0.3, 0.4, 0.5,"
var nums []float64
temperature := 0.6
for {
var n float64
_, err := fmt.Fscanf(strings.NewReader(input), "%f,", &n)
if err != nil {
break
}
nums = append(nums, n*temperature)
fmt.Printf("Read number: %f\n", n)
}
fmt.Println(nums)
}
上述程序会输出以下结果:
Read number: 0.100000
Read number: 0.200000
Read number: 0.300000
Read number: 0.400000
Read number: 0.500000
[0.06 0.12 0.18 0.24 0.3]
该程序从字符串input中读取数据,并使用格式字符串"%f,"读取逗号分隔的浮点数。读取的结果存储在nums切片中,可以使用Fprintf函数将其输出到控制台。在本例中,我们还使用了一个名为temperature的变量,将读取到的每个数字乘以0.6。
注意事项
以下是使用Fscanf时应该注意的一些事项:
格式化字符串顺序
Fscanf函数使用格式字符串指定要读取的项目及其顺序。如果格式不符合输入数据,则可能会导致意外的结果。在指定格式字符串时,请确保它与输入数据相匹配。
指定分隔符
Fscanf读取到分隔符时,会停止读取并将读取的数据添加到提供的变量中。例如,格式字符串"%s,"将读取到逗号分隔符时停止读取。
EOF错误
使用Fscanf函数时,如果遇到EOF错误,那么它将不会输出该错误,因此您需要记得检查要处理的数据总长度并在到达结尾时处理EOF错误,否则可能会出现意外的结果。
总结
fmt包中的Fscanf函数提供了一种从字符串中读取格式化数据的方法。使用该函数时,请确保格式字符串与输入数据相匹配,并且注意指定分隔符。如果遇到EOF错误,请确保处理它。该函数可以用于读取许多不同的数据类型,并且是实现读取文件和其他输入数据时一种很方便的之间方案。