'How to overwrite file content in golang

I have a empty file called a.txt, I want to output a value(int) to it in a loop, and overwrite last content in file a.txt. For example,

    // 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?
    }
go


Solution 1:[1]

Just use the truncate method and write again to file starting at the begining.

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

Solution 2:[2]

You can also try:

os.OpenFile with custom flags to truncate file, as shown below

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

Solution 3:[3]

Use os.Create() instead:

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

From the func's doc:

Create creates or truncates the named file. If the file already exists, it is truncated. If the file does not exist, it is created ...

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Grzegorz
Solution 3 Bohemian