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 ?
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!