为了账号安全,请及时绑定邮箱和手机立即绑定

从文件读取时如何查找EOF

从文件读取时如何查找EOF

Go
沧海一幻觉 2021-05-13 14:01:45
我正在使用以下代码在Go中读取文件:spoon , err := ioutil.ReadFile(os.Args[1])if err!=nil {        panic ("File reading error")}现在,我检查选择的每个字节是什么字符。例如:spoon[i]==' ' //for checking space同样,我读取了整个文件(我知道也许还有其他读取方式),但是保持这种方式完好无损,我怎么能知道已经达到文件的EOF并应该停止进一步读取呢?请不要建议找到的长度spoon并开始循环。我想要找到EOF的可靠方法。
查看完整描述

3 回答

?
慕尼黑8549860

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)

}


查看完整回答
反对 回复 2021-05-31
?
回首忆惘然

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

}


查看完整回答
反对 回复 2021-05-31
?
慕容708150

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没有返回错误)。


查看完整回答
反对 回复 2021-05-31
  • 3 回答
  • 0 关注
  • 251 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信