Go で一時ファイルに書き込まれたデータを読み取る
Go では、一時ファイルの作成と一時ファイルからの読み取りに課題が生じることがあります。次の簡略化されたテスト コードを考えてみましょう:
package main import ( "bufio" "fmt" "io/ioutil" "log" "os" "path/filepath" ) func main() { tmpFile, err := ioutil.TempFile("", fmt.Sprintf("%s-", filepath.Base(os.Args[0]))) if err != nil { log.Fatal("Could not create temporary file", err) } fmt.Println("Created temp file:", tmpFile.Name()) defer tmpFile.Close() fmt.Println("Writing some data to the temp file") if _, err = tmpFile.WriteString("test data"); err != nil { log.Fatal("Unable to write to temporary file", err) } else { fmt.Println("Data should have been written") } fmt.Println("Trying to read the temp file now") s := bufio.NewScanner(tmpFile) for s.Scan() { fmt.Println(s.Text()) } err = s.Err() if err != nil { log.Fatal("error reading temp file", err) } }
コードは一時ファイルを正しく作成して書き込みますが、読み取ろうとした結果は空の出力になります。これは、書き込み操作によりポインタがファイルの末尾に移動するためです。データを読み取るには、先頭に戻るシークが必要です。
解決策:
この問題を解決するには、tmpFile.Seek(0, 0) を追加して移動します。読み取りを試行する前にポインターをファイルの先頭に戻します:
tmpFile.Seek(0, 0) s := bufio.NewScanner(tmpFile) for s.Scan() { fmt.Println(s.Text()) }
この変更により、コードはデータを正しく読み取り、出力します。適切なリソース管理を確保するために、終了する前に defer tmpFile.Close() を使用してファイルを閉じることを忘れないでください。
以上がGo で一時ファイルに書き込まれたデータを読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。