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