Heim > Backend-Entwicklung > Golang > Wie lese ich Daten nach dem Schreiben in eine Datei mit einer einzigen *os.File in Go korrekt?

Wie lese ich Daten nach dem Schreiben in eine Datei mit einer einzigen *os.File in Go korrekt?

Barbara Streisand
Freigeben: 2024-12-16 00:31:09
Original
270 Leute haben es durchsucht

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

Handhabung von Lese- und Schreibvorgängen für Dateien mit einer einzigen *os.File in Go

Diese Frage verdeutlicht eine häufige Herausforderung bei der Arbeit mit Dateien in Gehen Sie dorthin, wo das Schreiben in eine Datei den aktuellen Positionszeiger verschiebt und möglicherweise verhindert, dass nachfolgende Lesevorgänge die erwarteten Daten abrufen.

Im bereitgestellten Code zielt das Programm darauf ab Schreiben Sie 10 Textzeilen in eine Datei mit dem Namen „test.txt“ und lesen Sie sie dann zurück. Allerdings liest der Code keine Daten und gibt stattdessen aufgrund eines io.EOF-Fehlers ständig „Fertig“ aus.

Um das Problem zu verstehen, ist es wichtig zu beachten, dass das Schreiben in eine os.File die Datei ändert Positionszeiger. Nach Abschluss der Schreibschleife befindet sich der Zeiger am Ende der Datei. Wenn das Programm versucht, die Datei zu lesen, beginnt es an der aktuellen Position. Da sich der Zeiger am Ende befindet, trifft er sofort auf io.EOF, was das Ende der Datei anzeigt.

Um dieses Problem zu beheben, muss man den Dateipositionszeiger vor dem Leseversuch auf den Anfang zurücksetzen. Dies kann mithilfe der Seek-Methode erreicht werden, wie im folgenden geänderten Code gezeigt:

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))
    }
}
Nach dem Login kopieren

Durch die korrekte Handhabung des Dateipositionszeigers kann das Programm nun die geschriebenen Daten erfolgreich aus der Datei lesen.

Das obige ist der detaillierte Inhalt vonWie lese ich Daten nach dem Schreiben in eine Datei mit einer einzigen *os.File in Go korrekt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage