我正在尝试弹出文件的第一行,从而逐个减少文件行。
我删除第一行的实现如下

type FS struct {
    ...
    File       *os.File
}

//File creation ok...


func (fs *Fs) pop() []byte {
    var buf []string
    scanner := bufio.NewScanner(fs.File)
    //Reading lines
    for scanner.Scan() {
        line := scanner.Text()
        buf = append(buf, line)
    }
    //Writing from second line on the same file
    for s := 1; s < len(buf); s++ {
        fs.File.WriteString(fmt.Println(buf[s]))
    }
    //Commit changes
    fs.File.Sync()
    fs.File.Close()

    return []byte(buf[0])
}

我得到了返回的[] byte和期望的字符串,但文件从未更改。
我在这里想念什么?

最佳答案



例如,

package main

import (
    "bytes"
    "fmt"
    "io"
    "os"
)

func popLine(f *os.File) ([]byte, error) {
    fi, err := f.Stat()
    if err != nil {
        return nil, err
    }
    buf := bytes.NewBuffer(make([]byte, 0, fi.Size()))

    _, err = f.Seek(0, io.SeekStart)
    if err != nil {
        return nil, err
    }
    _, err = io.Copy(buf, f)
    if err != nil {
        return nil, err
    }

    line, err := buf.ReadBytes('\n')
    if err != nil && err != io.EOF {
        return nil, err
    }

    _, err = f.Seek(0, io.SeekStart)
    if err != nil {
        return nil, err
    }
    nw, err := io.Copy(f, buf)
    if err != nil {
        return nil, err
    }
    err = f.Truncate(nw)
    if err != nil {
        return nil, err
    }
    err = f.Sync()
    if err != nil {
        return nil, err
    }

    _, err = f.Seek(0, io.SeekStart)
    if err != nil {
        return nil, err
    }
    return line, nil
}

func main() {
    fname := `popline.txt`
    f, err := os.OpenFile(fname, os.O_RDWR|os.O_CREATE, 0666)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    defer f.Close()
    line, err := popLine(f)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Println("pop:", string(line))
}

$ cat popline.txt
Lorem ipsum dolor坐在amet,私立教育精英,
塞德·杜伊斯莫德临时禁运和劳动大臣阿里夸。
Ut enim ad minim veniam,
quis nostrud exercitation ullamco labouris com commodo结果。
Duis aute irure dolor in reprehenderit in voltate velit esse cillum dolore eu fugiat nulla pariatur。
非偶然的圣人occaecat cupidatat,
放弃了动产和劳动动议。

$运行popline.go
流行音乐:Lorem ipsum dolor坐在amet处,奉献adipiscing精英,

$ cat popline.txt
塞德·杜伊斯莫德临时禁运和劳动大臣阿里夸。
Ut enim ad minim veniam,
quis nostrud exercitation ullamco labouris com commodo结果。
Duis aute irure dolor in reprehenderit in voltate velit esse cillum dolore eu fugiat nulla pariatur。
非偶然的圣人occaecat cupidatat,
放弃了动产和劳动动议。

$

07-24 09:19