【问题标题】:Reading files in bytes [closed]以字节为单位读取文件[关闭]
【发布时间】:2020-10-29 18:54:19
【问题描述】:

我正在尝试使用下面的代码来读取 2 个文件,并从顶部和底部删除一些行,但看起来我在读取文件时遇到了问题。 我的代码是:

//file: clean.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "strings"
)

func clean(files ...string) {
    for _, fn := range files {
        var f *os.File
        if f, err := os.OpenFile(fn, os.O_RDWR, 0); err != nil {
            log.Fatal("error", err)
        }
        defer func(f *os.File) {
            if err := f.Close(); err == nil {
                log.Fatal("error", err)
            }
        }(f)

        if fileBytes, err := ioutil.ReadAll(f); err != nil {
            log.Fatal("error", err)
        } else {
            lines := strings.Split(string(fileBytes), "\n")
            if fn == "currentInvenory.csv" {
                lines = lines[12 : len(lines)-5]
            } else {
                lines = lines[12 : len(lines)-6]
            }
            fmt.Println(fn, "has a total of", len(lines), "lines")
        }
    }
}

func main() {
    files := []string{"currentInvenory.csv", "currentTransactions.csv"}
    clean(files...)
}

但是得到了这个错误:

.\clean.go:14:6: f declared but not used

【问题讨论】:

  • f, err := ...f, err = ... 有一个错字
  • if f, err := os.OpenFile( ... 中的short variable declaration 定义了一个新变量f。这个新变量没有被使用。
  • 去掉条件中:=的冒号,声明err就跟它一样。您在不同的范围内有两个 f 变量,因此出现错误
  • 这能回答你的问题吗? Assignment operator in Go language
  • @RisingSun 然后我得到errundeclared name: err

标签: go


【解决方案1】:

感谢上面的cmets,问题是if f, err := os.OpenFile( ...)定义了一个新变量f,这个新变量没有用到。有两种可能的解决方案:

f, err := os.OpenFile(fn, os.O_RDWR, 0)
if err != nil {
    log.Fatal("error", err)
}

或者

var f *os.File
var err error
if f, err = os.OpenFile(fn, os.O_RDWR, 0); err != nil {
    log.Fatal("error", err)
}

所以,我现在的完整工作代码是:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "strings"
    "sync"
)

func clean(files ...string) {
    var wg sync.WaitGroup
    for _, fn := range files {
        wg.Add(1) // Launch several goroutines and increment the WaitGroup counter for each.
        go worker(fn, &wg)
    }
    wg.Wait()
}

func main() {
    files := []string{"currentInvenory.csv", "currentTransactions.csv"}
    clean(files...)

}

func worker(fn string, wg *sync.WaitGroup) {
    defer wg.Done()

    var f *os.File
    var err error
    if f, err = os.OpenFile(fn, os.O_RDWR, 0); err != nil {
        log.Fatal("error", err)
    }

    defer func() {
        if err := f.Close(); err != nil {
            log.Fatal("error", err)
        }
    }()

    if fileBytes, err := ioutil.ReadAll(f); err != nil {
        log.Fatal("error", err)
    } else {
        lines := strings.Split(string(fileBytes), "\n")
        if fn == "currentInvenory.csv" {
            lines = lines[11 : len(lines)-6]
        } else {
            lines = lines[11 : len(lines)-7]
        }
        fmt.Println(fn, "has a total of", len(lines), "lines")
        if len(lines) > 0 {
            var ctx = []byte{}
            for _, s := range lines {
                ctx = append(ctx, []byte(s)...)
            }
            ioutil.WriteFile(fn, ctx, 0644) // want (string, []byte, os.FileMode)
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多