package main import ( "bufio" "fmt" "io" "os" ) func main() { inputFile, inputError := os.Open("cookies.dat") if inputError != nil { fmt.Printf("開啟檔案時出錯", inputError.Error()) return // 退出函數 } defer inputFile.Close() inputReader := bufio.NewReader(inputFile) i := 0 for { inputString, readerError := inputReader.ReadString('n') if readerError == io.EOF { return } i++ fmt.Printf("第 %v 行:%s", i, inputString) } }變數 inputFile 是 *os.File 型別的。該型別是一個結構,表示一個開啟檔案的描述符(檔案控制代碼)。然後,使用 os 包裡的 Open 函數來開啟一個檔案。該函數的引數是檔名,型別為 string。在上面的程式中,我們以唯讀模式開啟 cookies.dat 檔案。
inputFile, inputError = os.Open("cookies.dat")
如果檔案開啟正常,我們就使用 defer.Close() 語句確保在程式退出前關閉該檔案。然後,我們使用 bufio.NewReader 來獲得一個讀取器變數。package main import ( "fmt" "io/ioutil" "os" ) func main() { inputFile := "products.txt" outputFile := "products_copy.txt" buf, err := ioutil.ReadFile(inputFile) if err != nil { fmt.Fprintf(os.Stderr, "File Error: %sn", err) // panic(err.Error()) } fmt.Printf("%sn", string(buf)) err = ioutil.WriteFile(outputFile, buf, 0x644) if err != nil { panic(err. Error()) } }
buf := make([]byte, 1024) ... n, err := inputReader.Read(buf) if (n == 0) { break}變數 n 的值表示讀取到的位元組數.
package main import ( "fmt" "os" ) func main() { file, err := os.Open("products2.txt") if err != nil { panic(err) } defer file.Close() var col1, col2, col3 []string for { var v1, v2, v3 string _, err := fmt.Fscanln(file, &v1, &v2, &v3) // scans until newline if err != nil { break } col1 = append(col1, v1) col2 = append(col2, v2) col3 = append(col3, v3) } fmt.Println(col1) fmt.Println(col2) fmt.Println(col3) }輸出結果:
[ABC FUNC GO]
[40 56 45]
[150 280 356]
注意:path 包裡包含一個子包叫 filepath ,這個子包提供了跨平台的函數,用於處理檔名和路徑。例如 Base() 函數用於獲得路徑中的最後一個元素(不包含後面的分隔符):
import "path/filepath"
filename := filepath.Base(path)
package main import ( "fmt" "bufio" "os" "compress/gzip" ) func main() { fName := "MyFile.gz" var r *bufio.Reader fi, err := os.Open(fName) if err != nil { fmt.Fprintf(os.Stderr, "%v, Can't open %s: error: %sn", os.Args[0], fName, err) os.Exit(1) } fz, err := gzip.NewReader(fi) if err != nil { r = bufio.NewReader(fi) } else { r = bufio.NewReader(fz) } for { line, err := r.ReadString('n') if err != nil { fmt.Println("Done reading file") os.Exit(0) } fmt.Println(line) } }
package main import ( "os" "bufio" "fmt" ) func main () { // var outputWriter *bufio.Writer // var outputFile *os.File // var outputError os.Error // var outputString string outputFile, outputError := os.OpenFile("output.dat", os.O_WRONLY|os.O_CREATE, 0666) if outputError != nil { fmt.Printf("An error occurred with file opening or creationn") return } defer outputFile.Close() outputWriter := bufio.NewWriter(outputFile) outputString := "hello world!n" for i:=0; i<10; i++ { outputWriter.WriteString(outputString) } outputWriter.Flush() }除了檔案控制代碼,我們還需要 bufio 的寫入器。我們以唯讀模式開啟檔案 output.dat ,如果檔案不存在則自動建立:
outputFile, outputError := os.OpenFile(“output.dat”, os.O_WRONLY|os.O_ CREATE, 0666)
可以看到,OpenFile 函數有三個引數:檔名、一個或多個標誌(使用邏輯運算子“|”連線),使用的檔案許可權。outputWriter := bufio.NewWriter(outputFile)
接著,使用一個 for 迴圈,將字串寫入緩衝區,寫 10 次:outputWriter.WriteString(outputString)
緩衝區的內容緊接著被完全寫入檔案:outputWriter.Flush()
fmt.Fprintf(outputFile, “Some test data.n”)
直接將內容寫入檔案。fmt 包裡的 F 開頭的 Print 函數可以直接寫入任何 io.Writer,包括檔案。package main import "os" func main() { os.Stdout.WriteString("hello, worldn") f, _ := os.OpenFile("test", os.O_CREATE|os.O_WRONLY, 0) defer f.Close() f.WriteString("hello, world in a filen") }使用
os.Stdout.WriteString("hello, worldn")
,我們可以輸出到螢幕。以只寫模式建立或開啟檔案“test”,並且忽略了可能發生的錯誤:f, _ := os.OpenFile(“test”, os.O_CREATE|os.O_WRONLY, 0)
不使用緩衝區,直接將內容寫入檔案:f.WriteString()