bufio.Writer写入后,bufio.Reader不会从文件中读取任何内容

代码如下:

package main

import (
    "bufio"
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    file,_ := os.OpenFile("test.txt",os.O_CREATE|os.O_RDWR|os.O_APPEND,0666)

    // write
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
        fmt.Fprintln(writer,i)
    }
    writer.Flush()

    // read
    reader := bufio.NewReader(file)
    for {
        line,_,err := reader.ReadLine()
        log.Println(string(line))
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatalln("get msg failed.")
        }
    }
}

我无法读取已写入文件的内容。

似乎文件的偏移量指向文件的末尾。

有人可以解释为什么会这样吗?

iCMS 回答:bufio.Writer写入后,bufio.Reader不会从文件中读取任何内容

O_APPEND导致文件描述符的偏移量在每次写入之前前进到文件末尾。每次写操作都会使文件描述符的偏移量增加成功写入的字节数。

//read行之前添加以下内容:

    offset,_ := file.Seek(0,io.SeekCurrent)
    fmt.Printf("DEBUG: before: file offset is %d\n",offset)
    file.Seek(0,0)
    offset,_ = file.Seek(0,io.SeekCurrent)
    fmt.Printf("DEBUG: after: file offset is %d\n",offset)

您会看到您的程序现在可以正常运行了。


参考:

open的手册页中:

       O_APPEND
              The file is opened in append mode.  Before each write(2),the
              file offset is positioned at the end of the file,as if with
              lseek(2).  The modification of the file offset and the write
              operation are performed as a single atomic step.

write的手册页中:

       For a seekable file (i.e.,one to which lseek(2) may be applied,for
       example,a regular file) writing takes place at the file offset,and
       the file offset is incremented by the number of bytes actually
       written.  If the file was open(2)ed with O_APPEND,the file offset is
       first set to the end of the file before writing.  The adjustment of
       the file offset and the write operation are performed as an atomic
       step.
本文链接:https://www.f2er.com/2016426.html

大家都在问