2 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超4個贊
bufio.ReadString讀取直到輸入中第一次出現(xiàn)delim為止,返回一個字符串,其中包含直到定界符(包括定界符)的數(shù)據(jù)。如果ReadString在找到定界符之前遇到錯誤,它將返回錯誤之前讀取的數(shù)據(jù)和錯誤本身(通常為io.EOF)。當(dāng)且僅當(dāng)返回的數(shù)據(jù)未以delim結(jié)尾時,ReadString才返回err!= nil。
如果buf.ReadString('\n')返回的錯誤不是io.EOF,例如bufio.ErrBufferFull,您將陷入無限循環(huán)。另外,如果文件未以結(jié)尾,則'\n'在last后面靜默忽略數(shù)據(jù)'\n'。
這是一個更強(qiáng)大的解決方案,僅執(zhí)行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貢獻(xiàn)1818條經(jīng)驗 獲得超3個贊
不逐行讀取可以改善大多數(shù)逐行讀取的代碼。如果您的目標(biāo)是讀取文件并訪問行,則以下內(nèi)容通常總是更好。
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)
}
}
任何錯誤都在同一時刻出現(xiàn),因此簡化了錯誤處理。如Peter所建議的那樣,在最后一行中刪除換行符可允許文件具有或不具有最后一個換行符。如今,與可用內(nèi)存相比,大多數(shù)文本文件很小,因此一口氣讀取它們是合適的。
- 2 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報