为了账号安全,请及时绑定邮箱和手机立即绑定

如何改善此文件的读取代码

如何改善此文件的读取代码

Go
肥皂起泡泡 2021-05-03 21:22:17
我目前有一段代码,可以逐行读取文件(以\ n分隔)file, _ := os.Open(filename) //deal with the error laterdefer file.Close()buf := bufio.NewReader(file)for line, err := buf.ReadString('\n'); err != io.EOF; line, err = buf.ReadString('\n'){    fmt.Println(strings.TrimRight(line, "\n"))}但是我不喜欢buf.ReadString("\n")在for循环中写两次,有人对改进有任何建议吗?
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

bufio.ReadString读取直到输入中第一次出现delim为止,返回一个字符串,其中包含直到定界符(包括定界符)的数据。如果ReadString在找到定界符之前遇到错误,它将返回错误之前读取的数据和错误本身(通常为io.EOF)。当且仅当返回的数据未以delim结尾时,ReadString才返回err!= nil。


如果buf.ReadString('\n')返回的错误不是io.EOF,例如bufio.ErrBufferFull,您将陷入无限循环。另外,如果文件未以结尾,则'\n'在last后面静默忽略数据'\n'。


这是一个更强大的解决方案,仅执行buf.ReadString('\n')一次。


package main


import (

    "bufio"

    "fmt"

    "io"

    "os"

    "strings"

)


func main() {

    filename := "FileName"

    file, err := os.Open(filename)

    if err != nil {

        fmt.Println(err)

        return

    }

    defer file.Close()

    buf := bufio.NewReader(file)

    for {

        line, err := buf.ReadString('\n')

        if err != nil {

            if err != io.EOF || len(line) > 0 {

                fmt.Println(err)

                return

            }

            break

        }

        fmt.Println(strings.TrimRight(line, "\n"))

    }

}


查看完整回答
反对 回复 2021-05-17
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

不逐行读取可以改善大多数逐行读取的代码。如果您的目标是读取文件并访问行,则以下内容通常总是更好。


package main


import (

    "fmt"

    "io/ioutil"

    "log"

    "strings"

)


func main() {

    b, err := ioutil.ReadFile("filename")

    if err != nil {

        log.Fatal(err)

    }

    s := string(b)                 // convert []byte to string

    s = strings.TrimRight(s, "\n") // strip \n on last line

    ss := strings.Split(s, "\n")   // split to []string

    for _, s := range ss {

        fmt.Println(s)

    }

}

任何错误都在同一时刻出现,因此简化了错误处理。如Peter所建议的那样,在最后一行中删除换行符可允许文件具有或不具有最后一个换行符。如今,与可用内存相比,大多数文本文件很小,因此一口气读取它们是合适的。


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信