Maison >développement back-end >Golang >Pourquoi la lecture à partir d'un pointeur Go *os.File après l'écriture entraîne-t-elle un EOF inattendu ?

Pourquoi la lecture à partir d'un pointeur Go *os.File après l'écriture entraîne-t-elle un EOF inattendu ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-23 14:05:17871parcourir

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

Lecture d'un fichier après écriture avec le même pointeur *os.File en Go

En Go, il est possible de créer, d'écrire et lisez les fichiers à l'aide du pointeur *os.File. Cependant, la lecture de données à partir du même pointeur de fichier après y avoir écrit peut entraîner un comportement inattendu.

Problème :

Considérez l'extrait de code suivant :

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))
    }
}

Dans ce code, nous créons un fichier et y écrivons 10 lignes à l'aide de la fonction fmt.Fprintf. Ensuite, nous essayons de lire 10 lignes du même pointeur de fichier à l'aide d'un bufio.NewReader. Cependant, le code affiche toujours « Terminé », indiquant que la fin du fichier a été atteinte.

Solution :

Le problème se pose car lorsque les données sont écrites dans un *os.File, le pointeur de fichier est déplacé vers la fin du fichier. Par conséquent, lorsque nous essayons de lire le fichier, nous commençons à la fin du fichier et rencontrons immédiatement l'indicateur de fin de fichier.

Pour résoudre ce problème, nous devons réinitialiser le pointeur du fichier sur le début du fichier avant de tenter de le lire. Ceci peut être réalisé en utilisant la fonction Seek :

_, err := f.Seek(0, 0)
if err != nil {
    fmt.Println("Error", err)
}

En ajoutant cette ligne après l'écriture dans le fichier, nous nous assurons que le pointeur de fichier est au début du fichier lorsque nous commençons la lecture, ce qui nous permet de réussir lire les données écrites.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn