您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Go語言文件開關及讀寫操作的方法”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Go語言文件開關及讀寫操作的方法”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在 Go 中操作文件,首先要做的就是導入 os 模塊,該模塊中具備相關函數定義。
package main import ( "fmt" "os" ) func main() { // 打開文件 file, err := os.Open("./ca.txt") if err != nil { fmt.Println("文件打開失敗", err) return } print(file) // 輸出地址 0xc000006028 // 關閉文件 file.Close() }
如果文件打開失敗,直接展示錯誤信息,正確的話,會返回 file 對象的地址。
使用 Read 函數讀取文件,其定義如下所示:
func (f *File) Read(b [] byte)(n int,err error)
從定義中可以發現,Read 函數會返回 2 個值,第一個是讀取的字節數,第二個是當讀取報錯時,返回錯誤信息,示例代碼如下所示:
package main import ( "fmt" "io" "os" ) func main() { // 打開文件 file, err := os.Open("./ca.txt") if err != nil { fmt.Println("打開文件失敗,錯誤信息:", err) return } // 為了防止忘記關閉文件,可使用defer注冊文件關閉語句 defer file.Close() // Read方法讀取數據 var tmp = make([]byte, 128) // 讀取文件 n, err := file.Read(tmp) // 碰到 io.EOF 表示文件讀取到末尾 if err == io.EOF { fmt.Println("文件讀取完畢") return } if err != nil { fmt.Println("讀取文件失敗,錯誤信息:", err) return } fmt.Printf("讀取了 %d 字節數據\n", n) fmt.Println(string(tmp[:n])) }
輸出如下內容:
讀取了 24 字節數據
姓名:夢想橡皮擦
讀取到 24 個字節,標準的中文占 3 個字節。
但是上述代碼最大的問題就是,我們給變量 tmp,即數組 tmp 僅設置了 128 字節,如果待讀取的文件超過了改值,例如 txt 內容如下所示:
姓名:夢想橡皮擦1
姓名:夢想橡皮擦2
姓名:夢想橡皮擦3
姓名:夢想橡皮擦4
姓名:夢想橡皮擦5
此時運行代碼,就會發現 Read
函數讀取到第 128 個字節的時候,就會停止讀取,間接導致讀取到的數據亂碼。
讀取了 128 字節數據
姓名:夢想橡皮擦1
姓名:夢想橡皮擦2
姓名:夢想橡皮擦3
姓名:夢想橡皮擦4
姓名:夢想橡??
解決該問題,需要用到 for 循環讀取文件數據,代碼如下:
package main import ( "fmt" "io" "os" ) func main() { // 打開文件 file, err := os.Open("./ca.txt") if err != nil { fmt.Println("打開文件失敗,錯誤信息:", err) return } defer file.Close() // 聲明一個 content 切片 var content []byte var tmp = make([]byte, 128) for { n, err := file.Read(tmp) if err == io.EOF { fmt.Println("文件讀取完畢") break } if err != nil { fmt.Println("讀取文件失敗,錯誤信息:", err) return } // 追加數據 content = append(content, tmp[:n]...) } fmt.Println(string(content)) }
上述代碼聲明了一個動態數組,即切片,解決了讀取數據不足的問題。
該函數可以一次讀取一行數據,示例代碼如下:
func main() { file, err := os.Open("./ca.txt") if err != nil { fmt.Println("打開文件失敗,錯誤信息:", err) return } defer file.Close() reader := bufio.NewReader(file) for { // 逐行讀取數據 line, err := reader.ReadString('\n') if err == io.EOF { if len(line) != 0 { fmt.Println(line) } fmt.Println("文件讀取完畢") break } if err != nil { fmt.Println("讀取文件失敗,錯誤信息:", err) return } fmt.Print(line) } }
該函數與 Python 中的 readline
具備同樣的效果,接下來演示一下讀取整個文件,代碼如下:
package main import ( "fmt" "io/ioutil" ) func main() { content, err := ioutil.ReadFile("./ca.txt") if err != nil { fmt.Println("打開文件失敗,錯誤信息:", err) return } fmt.Println(string(content)) }
注意導入模塊的時候,直接導入了 io
包中的 ioutil
函數。
使用 os.OpenFile()
函數可以指定模式打開文件,即可以寫入的方式打開文件。
寫入文件最常用的函數是 Write
和 WriteString
,示例代碼如下所示:
package main import ( "fmt" "os" ) func main() { file, err := os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) if err != nil { fmt.Println("打開文件失敗,錯誤信息:", err) return } defer file.Close() name := "橡皮擦" file.Write([]byte(name)) //寫入字節切片 file.WriteString("夢想橡皮擦") //寫入字符串 }
使用該方式寫入文件,會覆蓋之前的文件內容,查看結果可直接打開目錄下的 ca.txt
進行查看。
我們將 os.OpenFile("ca.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) 中的參數進行單獨的說明。
第一個參數表示文件名,第二個參數是打開文件的模式,具體模式如下所示:
os.O_WRONLY
:只寫;
os.O_CREATE
:創建文件;
os.O_RDONLY
:只讀;
os.O_RDWR
:讀寫;
os.O_TRUNC
:清空;
os.O_APPEND
:追加。
可以看到與 Python 中的文件模式基本一致。
最后一個參數值 0666
表示文件權限(八進制),這與 linux 文件權限數字一致,讀 r
等于 4(感謝博友指出該錯誤),寫 w
表示 2,執行 x
等于 1,所以 666 表示的是文件可讀,可寫。
在文件寫入部分,還存在 bufio.NewWriter
整行寫入,ioutil.WriteFile
整體寫入等內容,可以學習的時候重點查閱一下。
讀到這里,這篇“Go語言文件開關及讀寫操作的方法”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。