3 回答
TA貢獻1818條經驗 獲得超11個贊
使用io.EOF到測試結束文件。例如,要計算文件中的空格:
package main
import (
"fmt"
"io"
"os"
)
func main() {
if len(os.Args) <= 1 {
fmt.Println("Missing file name argument")
return
}
f, err := os.Open(os.Args[1])
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
data := make([]byte, 100)
spaces := 0
for {
data = data[:cap(data)]
n, err := f.Read(data)
if err != nil {
if err == io.EOF {
break
}
fmt.Println(err)
return
}
data = data[:n]
for _, b := range data {
if b == ' ' {
spaces++
}
}
}
fmt.Println(spaces)
}
TA貢獻1847條經驗 獲得超11個贊
ioutil.ReadFile()將文件的全部內容讀取到一個字節片中。您無需擔心EOF。當您一次讀取一個文件塊時,EOF是一種必需的構造。一次讀取一個塊時,您需要知道哪個塊已到達文件末尾。
ioutil.ReadFile()您所需要的只是返回的字節片的長度。
data := ioutil.ReadFile(os.Args[1])
// Do we need to know the data size?
slice_size := len(data)
// Do we need to look at each byte?
for _,byte := range data {
// do something with each byte
}
TA貢獻1831條經驗 獲得超4個贊
使用時ioutil.ReadFile(),從設計上講,您永遠不會看到io.EOF,因為ReadFile會讀取整個文件,直到達到EOF為止。因此,它返回的切片是整個文件。從文檔中:
ReadFile讀取以文件名命名的文件并返回內容。成功的調用將返回err == nil,而不是err == EOF。因為ReadFile讀取整個文件,所以它不會將Read中的EOF視為要報告的錯誤。
從您的問題中,您明確提到,您知道還有其他讀取文件的方法,其中一些方法要求您測試io.EOF的錯誤,而不是ReadFile。
然后,使用您擁有的切片,就可以使用for ... range構造讀取文件,就像其他人提到的那樣。這是讀取整個文件的肯定方法,僅此而已(同樣,ReadFile會負責)?;蛘邚?迭代到len(spoon)-1也可以,但是range更慣用,并且基本上是相同的。
換句話說:到達切片的末尾時,您到達文件的末尾(前提是ReadFile沒有返回錯誤)。
- 3 回答
- 0 關注
- 300 瀏覽
添加回答
舉報
