首页 > 后端开发 > Golang > Go中使用单个*os.File写入文件后如何正确读取数据?

Go中使用单个*os.File写入文件后如何正确读取数据?

Barbara Streisand
发布: 2024-12-16 00:31:09
原创
271 人浏览过

How to Correctly Read Data After Writing to a File Using a Single *os.File in Go?

在 Go 中使用单个 *os.File 处理文件读写操作

这个问题突出了在 Go 中处理文件的常见挑战Go,写入文件会移动当前位置指针,可能会阻止后续读取操作检索预期数据。

在提供的代码中,该程序的目标是将 10 行文本写入名为“test.txt”的文件,然后将其读回。但是,由于 io.EOF 错误,代码不会读取任何数据,而是连续打印“完成”。

要理解此问题,请务必注意写入 os.File 会修改文件位置指针。完成写循环后,指针位于文件末尾。当程序尝试读取文件时,它从当前位置开始。由于指针位于末尾,因此它立即遇到 io.EOF,表示文件结束。

要解决此问题,必须在尝试读取之前将文件位置指针重置到开头。这可以使用 Seek 方法来实现,如下面修改后的代码所示:

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)
    }
    // reset file pointer
    _, err := f.Seek(0, 0)
    if err != nil {
        fmt.Println("Error", err)
    }
    // 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))
    }
}
登录后复制

通过正确处理文件位置指针,程序现在可以成功从文件中读取写入的数据。

以上是Go中使用单个*os.File写入文件后如何正确读取数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板