Maison > développement back-end > Golang > Comment lire correctement les données après avoir écrit dans un fichier à l'aide d'un seul *os.File dans Go ?

Comment lire correctement les données après avoir écrit dans un fichier à l'aide d'un seul *os.File dans Go ?

Barbara Streisand
Libérer: 2024-12-16 00:31:09
original
271 Les gens l'ont consulté

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

Gestion des opérations de lecture et d'écriture de fichiers avec un seul fichier *os.File dans Go

Cette question met en évidence un défi courant dans le travail avec des fichiers dans Go, où l'écriture dans un fichier déplace le pointeur de position actuelle, empêchant potentiellement les opérations de lecture ultérieures de récupérer les données attendues.

Dans le code fourni, le programme vise à écrivez 10 lignes de texte dans un fichier nommé "test.txt", puis relisez-les. Cependant, le code ne lit aucune donnée et affiche en permanence « Terminé » en raison d'une erreur io.EOF.

Pour comprendre le problème, il est crucial de noter que l'écriture dans un fichier os.File modifie le fichier. pointeur de position. Après avoir terminé la boucle d'écriture, le pointeur se situe à la fin du fichier. Lorsque le programme tente de lire le fichier, il démarre à la position actuelle. Puisque le pointeur est à la fin, il rencontre instantanément io.EOF, signifiant la fin du fichier.

Pour remédier à ce problème, il faut réinitialiser le pointeur de position du fichier au début avant de tenter de lire. Ceci peut être réalisé en utilisant la méthode Seek, comme démontré dans le code modifié ci-dessous :

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))
    }
}
Copier après la connexion

En gérant correctement le pointeur de position du fichier, le programme peut désormais lire avec succès les données écrites du fichier.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal