从文件读取时如何查找EOF

我正在使用以下代码在Go中读取文件:


spoon , err := ioutil.ReadFile(os.Args[1])

if err!=nil {

        panic ("File reading error")

}

现在,我检查选择的每个字节是什么字符。例如:


spoon[i]==' ' //for checking space

同样,我读取了整个文件(我知道也许还有其他读取方式),但是保持这种方式完好无损,我怎么能知道已经达到文件的EOF并应该停止进一步读取呢?


请不要建议找到的长度spoon并开始循环。我想要找到EOF的可靠方法。


沧海一幻觉
浏览 252回答 3
3回答

慕尼黑8549860

使用io.EOF到测试结束文件。例如,要计算文件中的空格:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "io"&nbsp; &nbsp; "os")func main() {&nbsp; &nbsp; if len(os.Args) <= 1 {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("Missing file name argument")&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; f, err := os.Open(os.Args[1])&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(err)&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; defer f.Close()&nbsp; &nbsp; data := make([]byte, 100)&nbsp; &nbsp; spaces := 0&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; data = data[:cap(data)]&nbsp; &nbsp; &nbsp; &nbsp; n, err := f.Read(data)&nbsp; &nbsp; &nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if err == io.EOF {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(err)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; data = data[:n]&nbsp; &nbsp; &nbsp; &nbsp; for _, b := range data {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if b == ' ' {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spaces++&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println(spaces)}

回首忆惘然

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 {&nbsp; &nbsp; // do something with each byte}

慕容708150

使用时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没有返回错误)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go