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

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

在go中緩沖讀取寫入同一文件

在go中緩沖讀取寫入同一文件

Go
互換的青春 2023-08-14 16:35:10
我正在嘗試逐行讀取一個非常大的文件,然后替換行中的某些內容并寫回同一個文件。我找不到辦法做到這一點。目前我已經創建了一個臨時文件并將替換的行保存在臨時文件中,最后將臨時文件內容復制到原始文件中。但我必須進行兩次讀取和兩次寫入。我想避免這種情況。有任何想法嗎。以下是我嘗試過的:file, _ := os.Open("somelargesay1GbFile.txt")defer file.Close()outFile, _ := os.OpenFile("temp.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)defer outFile.Close()reader := bufio.NewReaderSize(file, 10*1024)for {    bytesread, isprefix, err := reader.ReadLine()    if err != nil {        if err == io.EOF {            data := changeTheData(string(bytesread))            outFile.WriteString(data)            if !isprefix {                outFile.WriteString("\r\n")            }        } else {            log.Fatal(err)        }        break    }    data := changeTheData(string(bytesread))    outFile.WriteString(data)    if !isprefix {        outFile.WriteString("\r\n")    }}最后我刪除該文件somelargesay1GbFile.txt并將其重命名為temp.txt
查看完整描述

1 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

解決方案是打開文件兩次,第一次用于讀取,第二次用于覆蓋內容。


請參閱下面的代碼。


請注意,我使用reader.ReadString('\n')而不是ReadLine. 另請注意,我在測試錯誤之前寫入輸出。這是因為最后一行不以“\n”結尾的行與錯誤一起返回io.EOF。


func main() {

    inFile, _ := os.Open("file.txt")

    defer inFile.Close()


    outFile, _ := os.OpenFile("file.txt", os.O_RDWR, 0777)

    defer outFile.Close()


    reader := bufio.NewReaderSize(inFile, 10*1024)


    for {

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

        outFile.WriteString(changeData(line))

        if err != nil {

            if err != io.EOF {

                fmt.Println("error:", err)

            }

            break

        }

    }

}

我用這個函數測試了代碼changeData,將小寫字母更改為大寫字母,將大寫字母更改為小寫字母。然后我們可以通過重復調用函數來測試更改。


func changeData(data string) string {

    o := make([]rune, 0, len(data))

    for _, r := range data {

        if unicode.IsLetter(r) {

            if unicode.IsUpper(r) {

                o = append(o, unicode.ToLower(r))

            } else {

                o = append(o, unicode.ToUpper(r))

            }

        } else {

            o = append(o, r)

        }

    }

    return string(o)

}

此代碼將覆蓋文件的每一行。該行是否被修改取決于changeData修改的內容。


如果您想避免覆蓋每一行,因為大多數行不需要更改,那么您必須尋找要覆蓋數據的位置。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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