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"))
}
}
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所建议的那样,在最后一行中删除换行符可允许文件具有或不具有最后一个换行符。如今,与可用内存相比,大多数文本文件很小,因此一口气读取它们是合适的。
- 2 回答
- 0 关注
- 178 浏览
添加回答
举报