ホームページ  >  記事  >  バックエンド開発  >  Go で一時ファイルに書き込まれたデータを読み取る方法は?

Go で一時ファイルに書き込まれたデータを読み取る方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-17 02:53:03524ブラウズ

How to Read Data Written to a Temp File in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。