代码是这样的。我可以运行代码,没有错误。读取文件\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)\nRun 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,则必须重新打开该文件。