file - 在 Go 中使用相同的 *os.File 写入和读取文件

标签 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))
    }
}

程序总是打印“完成”文本

最佳答案

当您写入 os.File 时,它会移动当前文件位置指针。这意味着在写入文件循环之后,文件指针位于文件末尾。

现在,如果您尝试从文件中读取,您会立即获得 io.EOF,因为您位于文件的末尾。

要解决它,您必须 Seek在读取文件之前先到文件的开头。

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

关于file - 在 Go 中使用相同的 *os.File 写入和读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64925992/

相关文章:

json - 将字符串映射到具有不同值的映射

unit-testing - 如何在向 API 发送 http 请求时进行模拟

go - 通过引用 "defer"传递的数据

go - 在 Go 中并发生成随机数

linux - 有没有办法在linux内核中找到映射到进程虚拟内存区域的文件的文件名?

c - 用 C 解析文本文件

C++ Ifstream 读太多?

c - 生成迭代的程序

c - 如果文件有空格则读取数据

javascript - JSON 无法将对象解码为字符串类型的 GO 值