Go で同じ *os.File ポインタで書き込んだ後にファイルから読み取る
Go では作成、書き込みが可能、*os.File ポインタを使用してファイルを読み取ります。ただし、同じファイル ポインタにデータを書き込んだ後にデータを読み取ると、予期しない動作が発生する可能性があります。
問題:
次のコード スニペットを考えてみましょう:
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) } // 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)) } }
このコードでは、ファイルを作成し、fmt.Fprintf 関数を使用してファイルに 10 行を書き込みます。その後、bufio.NewReader を使用して、同じファイル ポインターから 10 行の読み取りを試みます。ただし、コードは常にファイルの終わりに達したことを示す「Done」を出力します。
解決策:
この問題は、データが書き込まれるときに発生します。 *os.File の場合、ファイル ポインタはファイルの末尾に移動します。その結果、ファイルから読み取ろうとすると、ファイルの終わりから開始し、すぐにファイル終了インジケーターが表示されます。
この問題を解決するには、ファイル ポインターを次の場所にリセットする必要があります。ファイルからの読み取りを試行する前に、ファイルの先頭に戻ります。これは、Seek 関数を使用して実現できます。
_, err := f.Seek(0, 0) if err != nil { fmt.Println("Error", err) }
ファイルへの書き込み後にこの行を追加すると、読み取りを開始するときにファイル ポインターがファイルの先頭にあることが保証され、正常に読み込むことができます。書き込まれたデータを読み取ります。
以上が書き込み後に Go *os.File ポインターから読み取ると予期しない EOF が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。