您可以使用bufio.Reader讀取用ReadLine或ReadString方法和使用方法Read讀取文件的剩餘部分的前3行。
閱讀前3行後,可以使用strings包分割第二行,然後使用strconv包將包含數字的字符串解析爲整數。
例如:
r := bufio.NewReader(file)
line1, err := r.ReadString('\n')
if err != nil {
panic(err)
}
// repeat to read line 2 and 3
size := strings.Split(line2, " ")
width, err := strconv.Atoi(size[0])
if err != nil {
panic(err)
}
height, err := strconv.Atoi(size[1])
if err != nil {
panic(err)
}
// repeat with line 3
更新:
正如Adrian在評論中提到的,你可以同時使用bufio.Scanner與bufio.ScanWordSplitFunc
掃描的元數據。
s := bufio.NewScanner(r)
s.Split(bufio.ScanWords)
var count int
for s.Scan() && count < 4 {
switch count {
case 0:
magic = s.Text()
case 1:
if width, err = strconv.Atoi(s.Text()); err != nil {
return
}
case 2:
if height, err = strconv.Atoi(s.Text()); err != nil {
return
}
case 3:
if color, err = strconv.Atoi(s.Text()); err != nil {
return
}
}
count++
}
https://play.golang.org/p/-rOJb_WlFf
是在一個字符串表示的整數,或者是他們的二進制?他們的尺寸是多少,或者他們的劃分方式如何?如果它們是二進制的,那麼是大端序列還是小端序列? – JimB
我認爲從spakin/netpbm的傢伙有一個非常簡潔的方式,使用bufio爲netpbm文件提取元數據部分(請參閱他們的[github-repo](https://github.com/spakin/netpbm/blob/master/netpbm .go)) – skymon
@JimB我給出的例子是從一個真實文件中提取的。元數據寫在例子「P6 \ n480 360 \ n255 \ n」中,其餘(數據)只是字節。它全部用utf-8編碼。 –