ホームページ >バックエンド開発 >Golang >書き込み後に Go *os.File ポインターから読み取ると予期しない EOF が発生するのはなぜですか?

書き込み後に Go *os.File ポインターから読み取ると予期しない EOF が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-23 14:05:17930ブラウズ

Why Does Reading from a Go *os.File Pointer After Writing Result in Unexpected EOF?

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

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