在 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中文网其他相关文章!