亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

文件掃描器循環不執行

文件掃描器循環不執行

Go
收到一只叮咚 2023-08-07 14:42:06
我正在獲取文本文件的最后一行,并嘗試讀取它。獲取最后一行:func getLastLine(file *os.File) (result int) {    s := bufio.NewScanner(file)    result = 0    for s.Scan() {        result++    }    err := s.Err()    if err != nil {        log.Fatal(err)    }    return}讀取文件:func readFileFrom(file *os.File) {    s := bufio.NewScanner(file)    for s.Scan() {        fmt.Println(s.Text())    }    err := s.Err()    if err != nil {        log.Fatal(err)    }}如果我把這個寫在main.go:    getLastLine(file)    readFileFrom(file)它不會執行該塊:for s.Scan() {    fmt.Println(s.Text())}如果我刪除該行getLastLine(file),則讀取將按預期進行。我認為這是因為 2 個掃描儀正在訪問同一個文件。
查看完整描述

1 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

os.File維護下一個讀或寫操作將工作的位置。讀取/寫入文件會更新此位置。

如果您使用 single?file,將其傳遞給getLastLine()將讀取它直到其末尾,因此它的指針將指向文件的末尾?,F在將其傳遞給readFileFrom()將不會讀取和打印任何內容,因為文件末尾之后沒有更多數據(這是“結束”的定義)。

您需要使用 倒回指針File.Seek(),或者需要關閉并重新打開它。顯然,僅倒帶效率更高。要將指針設置為文件開頭:

if _, err := file.Seek(0, io.SeekStart); err != nil {

? ? panic(err)

}

因此,在兩個函數調用之間執行此操作:


getLastLine(file)

if _, err := file.Seek(0, io.SeekStart); err != nil {

? ? panic(err)

}

readFileFrom(file)

另請注意,如果您打開文件兩次,則無需倒回它,并且您還可以同時運行這兩個函數而不會相互干擾,因為它們只讀取文件并且每個函數都有自己的指針os.File。


file1, err := os.Open("a.txt")

// handle err

defer file1.Close()


file2, err := os.Open("a.txt")

// handle err

defer file2.Close()


wg := sync.WaitGroup()

wg.Add(1)

go func() {

? ? defer wg.Done()

? ? getLastLine(file1)

}()


readFileFrom(file2)


wg.Wait() // Wait for getLastLine() to complete


查看完整回答
反對 回復 2023-08-07
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號