ホームページ > バックエンド開発 > Golang > Go で単一の *os.File を使用してファイルに書き込んだ後にデータを正しく読み取る方法は?

Go で単一の *os.File を使用してファイルに書き込んだ後にデータを正しく読み取る方法は?

Barbara Streisand
リリース: 2024-12-16 00:31:09
オリジナル
270 人が閲覧しました

How to Correctly Read Data After Writing to a File Using a Single *os.File in Go?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート