如何覆盖golang中的文件内容

qxi*_*ing 8 go

我有一个名为 的空文件a.txt,我想在循环中向它输出一个 value(int),并覆盖 file 中的最后一个内容a.txt。例如,

    // open a file
    f, err := os.Open("test.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    // another file
    af, err := os.OpenFile("a.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
    if err != nil {
        log.Fatal(err)
    }
    defer af.Close()

    b := []byte{}

    scanner := bufio.NewScanner(f)
    for scanner.Scan() {
        b = append(b, scanner.Bytes()...)
        // how to output len(b) into a.txt?
    }
Run Code Online (Sandbox Code Playgroud)

Akh*_*yil 24

你也可以试试:

os.OpenFile带有自定义标志来截断文件,如下图

package main

import (
    "log"
    "os"
)

func main() {
    f, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0755)
    if err != nil {
        log.Fatal(err)
    }
    if err := f.Close(); err != nil {
        log.Fatal(err)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用 os.Create ,因为它在内部使用相同的代码片段 (5认同)

Boh*_*ian 14

改用os.Create()

f, err := os.Create("test.txt")
Run Code Online (Sandbox Code Playgroud)

来自 func 的文档:

Create 创建或截断指定文件。如果文件已存在,则会被截断。如果该文件不存在,则创建该文件...


Grz*_*Żur 9

只需使用truncate方法并从头开始再次写入文件。

err = f.Truncate(0)
_, err = f.Seek(0, 0)
_, err = fmt.Fprintf(f, "%d", len(b))
Run Code Online (Sandbox Code Playgroud)

  • 这只是部分解决方案,因为它将导致文件开头出现前导零。你还需要寻找起点。```err = f.Truncate(0) _, err = f.Seek(0, 0)``` 请参阅 /sf/answers/3109175331/ (2认同)