代码是这样的。我可以无错误地运行代码。读取文件时,什么也得不到
file,err := os.OpenFile("writeAt.txt",os.O_CREATE|os.O_APPEND|os.O_RDWR,777)
if err != nil{
panic(err)
}
fmt.Println(file)
reader := bytes.NewReader([]byte("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"))
_,err = reader.WriteTo(file)
if err != nil{
panic(err)
}
fmt.Println(file)
reader = bytes.NewReader([]byte("bbbbbbbbbbbbbbbbbbbb\n"))
_,err = reader.WriteTo(file)
if err != nil{
panic(err)
}
writer := bufio.NewWriter(os.Stdout)
n,err := writer.ReadFrom(file)
if err != nil{
panic(err)
}
fmt.Println("n",n)
当您打开一个文件并对其进行写入时,文件指针(决定读取和写入发生的位置)会不断增加,因此下一次写入始终写入最后。没有单独的“读取”和“写入”指针,只有一个指针用于读取和写入。在你写完东西之后,如果你想阅读你刚刚写到文件中的内容,你必须将指针“倒回”到开头。
这意味着在写入后尝试读取将不会读取任何内容,因为文件指针指向文件末尾。关闭并重新打开文件会将指针定位到文件的开头,这就是您在重新打开后成功读取文件的原因。
要在不重新打开的情况下读取写入的内容,请使用 将指针设置为文件开头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
还有一件更重要的事情。引自File.Seek()
:
未指定对使用 O_APPEND 打开的文件的 Seek 行为。
由于您确实使用 来打开文件O_APPEND
,因此上述操作可能会成功,也可能不会成功。因此,O_APPEND
如果您想重新阅读所写的内容,请不要使用。或者,如果您必须使用O_APPEND
,则必须重新打开该文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句