Go で単一の *os.File を使用したファイルの読み取りおよび書き込み操作を処理する
この質問は、Go でファイルを操作する際の一般的な課題を浮き彫りにしています。 Go では、ファイルに書き込むと現在位置ポインターが移動し、後続の読み取り操作で予期したデータが取得できなくなる可能性があります。
In提供されたコードを使用すると、プログラムは 10 行のテキストを「test.txt」という名前のファイルに書き込み、それを読み取ることを目的としています。ただし、コードはデータをまったく読み取らず、io.EOF エラーにより「Done」を出力し続けます。
この問題を理解するには、os.File への書き込みによってファイルが変更されることに注意することが重要です。位置ポインタ。書き込みループが完了すると、ポインタはファイルの末尾に配置されます。プログラムがファイルを読み取ろうとすると、現在の位置から開始されます。ポインタは最後にあるため、ファイルの終わりを示す io.EOF に即座に遭遇します。
この問題を解決するには、読み取りを試行する前にファイル位置ポインタを先頭にリセットする必要があります。これは、以下の変更されたコードに示すように、Seek メソッドを使用して実現できます。
package main import ( "bufio" "fmt" "io" "os" ) func main() { filename := "test.txt" f, _ := os.OpenFile(filename, os.O_CREATE|os.O_TRUNC|os.O_RDWR, os.ModePerm) defer os.Remove(filename) // write 10 times for i := 0; i < 10; i++ { fmt.Fprintf(f, "test%d\n", i) } // reset file pointer _, err := f.Seek(0, 0) if err != nil { fmt.Println("Error", err) } // read 10 times r := bufio.NewReader(f) for i := 0; i < 10; i++ { str, _, err := r.ReadLine() if err != nil { if err == io.EOF { fmt.Println("Done") return } fmt.Println("Error", err) } fmt.Println("Read", string(str)) } }
ファイル位置ポインターを正しく処理することにより、プログラムはファイルから書き込まれたデータを正常に読み取ることができるようになりました。
以上がGo で単一の *os.File を使用してファイルに書き込んだ後にデータを正しく読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。