首页 >后端开发 >Golang >为什么写入后读取 Go *os.File 指针会导致意外的 EOF?

为什么写入后读取 Go *os.File 指针会导致意外的 EOF?

Linda Hamilton
Linda Hamilton原创
2024-12-23 14:05:17872浏览

Why Does Reading from a Go *os.File Pointer After Writing Result in Unexpected EOF?

在 Go 中使用相同的 *os.File 指针写入后读取文件

在 Go 中,可以创建、写入,并使用 *os.File 指针读取文件。但是,在写入数据后从同一文件指针读取数据可能会导致意外行为。

问题:

考虑以下代码片段:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func main() {
    filename := "test.txt"
    f, _ := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm)
    defer os.Remove(filename)

    // Write 10 times
    for i := 0; i< 10; i++ {
        fmt.Fprintf(f, "test%d\n", i)
    }

    // Read 10 times
    r := bufio.NewReader(f)
    for i := 0; i < 10; i++ {
        str, _, err := r.ReadLine()
        if err != nil {
            if err == io.EOF {
                fmt.Println("Done")
                return
            }
            fmt.Println("Error", err)
        }
        fmt.Println("Read", string(str))
    }
}

在此代码中,我们创建一个文件并使用 fmt.Fprintf 函数向其中写入 10 行。之后,我们尝试使用 bufio.NewReader 从同一文件指针读取 10 行。但是,代码始终打印“完成”,表明已到达文件末尾。

解决方案:

出现问题的原因是当数据写入*os.File,文件指针移动到文件末尾。因此,当我们尝试读取文件时,我们从文件末尾开始并立即遇到文件结束指示符。

要解决此问题,我们需要将文件指针重置为在尝试读取文件之前先查看文件的开头。这可以使用Seek函数来实现:

_, err := f.Seek(0, 0)
if err != nil {
    fmt.Println("Error", err)
}

通过在写入文件后添加这一行,我们可以确保当我们开始读取时文件指针位于文件的开头,从而使我们能够成功读取写入的数据。

以上是为什么写入后读取 Go *os.File 指针会导致意外的 EOF?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn