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会负责)。或者从0迭代到len(spoon)-1也可以,但是range更惯用,并且基本上是相同的。
换句话说:到达切片的末尾时,您到达文件的末尾(前提是ReadFile没有返回错误)。
- 3 回答
- 0 关注
- 251 浏览
添加回答
举报