如何在Golang中覆盖文件内容

25

我有一个名为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?
    }
3个回答

48

你也可以尝试:

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)
    }
}

5
你也可以使用os.Create,因为它在内部使用相同的代码片段。 - Akshay Mukadam

17

只需使用截断方法并从文件开头重新写入即可。

err = f.Truncate(0)
_, err = f.Seek(0, 0)
_, err = fmt.Fprintf(f, "%d", len(b))

2
这只是一个部分解决方案,因为它会在文件开头产生前导零。您还需要寻找开头。_, err = f.Seek(0, 0)``` 请参阅 https://dev59.com/4FcP5IYBdhLWcg3wcZYj#44416790 - Peter

12

请使用os.Create()

f, err := os.Create("test.txt")

从func的文档中:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接