qxing
qxing

Reputation: 391

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

Upvotes: 32

Views: 56934

Answers (4)

meh
meh

Reputation: 3133

There is also os.WriteFile. It is the first function in the Go by Example page on writing files. It truncates before writing.

https://gobyexample.com/writing-files

    d1 := []byte("hello\ngo\n")
    err := os.WriteFile("/tmp/dat1", d1, 0644)

Upvotes: 1

Bohemian
Bohemian

Reputation: 425428

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 ...

Upvotes: 14

Grzegorz Żur
Grzegorz Żur

Reputation: 49251

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

Upvotes: 20

Akhil Thayyil
Akhil Thayyil

Reputation: 9413

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

Upvotes: 52

Related Questions