打开一个文件并写入一些单词然后读取它什么也得不到

TiD*_*Dao 2 file go

代码是这样的。我可以运行代码,没有错误。读取文件\xef\xbc\x8ccan\xe2\x80\x98t 时得到任何东西

\n
    file,err := os.OpenFile("writeAt.txt",os.O_CREATE|os.O_APPEND|os.O_RDWR,777)\n    if err != nil{\n        panic(err)\n    }\n    fmt.Println(file)\n    reader := bytes.NewReader([]byte("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n"))\n    _,err = reader.WriteTo(file)\n    if err != nil{\n        panic(err)\n    }\n    fmt.Println(file)\n    reader = bytes.NewReader([]byte("bbbbbbbbbbbbbbbbbbbb\\n"))\n    _,err = reader.WriteTo(file)\n    if err != nil{\n        panic(err)\n    }\n    writer := bufio.NewWriter(os.Stdout)\n    n,err := writer.ReadFrom(file)\n    if err != nil{\n        panic(err)\n    }\n    fmt.Println("n",n)\n
Run Code Online (Sandbox Code Playgroud)\n

icz*_*cza 10

当您打开文件并向其写入时,文件指针(决定读取和写入发生的位置)会不断递增,因此下一次写入始终写入末尾。没有单独的“读”和“写”指针,只有一个指针来进行读和写。写入内容后,如果您想读取刚刚写入文件的内容,则必须将指针“倒回”到开头。

这意味着在写入后尝试读取将不会读取任何内容,因为文件指针指向文件末尾。关闭并重新打开文件会将指针定位到文件的开头,这就是您在重新打开后成功读取文件的原因。

要读取写入的内容而不重新打开,请使用 将指针设置为文件的开头File.Seek()

例如:

if _, err := file.Seek(0, io.SeekStart); err != nil {
    log.Printf("Failed to seek: %v", err)
}

// Now you can read content written to it previosly
Run Code Online (Sandbox Code Playgroud)

还有一件更重要的事情。引用自File.Seek()

未指定使用 O_APPEND 打开的文件上的 Seek 行为。

由于您确实使用 打开文件O_APPEND,因此上述操作可能会成功,也可能不会成功。O_APPEND因此,如果您想重新阅读书面内容,请勿使用。或者,如果您必须使用O_APPEND,则必须重新打开该文件。