Vous pouvez utiliser os.File (qui met en œuvre le io.Reader ) avec l'interface bufio pour cela. Cependant, ces paquets sont construits en tenant compte d'une utilisation fixe de la mémoire (quelle que soit la taille du fichier) et sont assez rapides.
Malheureusement, cela rend la lecture du fichier entier dans la mémoire un peu plus compliquée. Vous pouvez utiliser un octets.Buffer pour joindre les parties de la ligne si elles dépassent la limite de la ligne. Quoi qu'il en soit, je vous recommande d'essayer d'utiliser le lecteur de ligne directement dans votre projet (surtout si vous ne savez pas quelle est la taille du fichier texte !) Mais si le fichier est petit, l'exemple suivant peut être suffisant pour vous :
package main
import (
"os"
"bufio"
"bytes"
"fmt"
)
// Read a whole file into the memory and store it as array of lines
func readLines(path string) (lines []string, err os.Error) {
var (
file *os.File
part []byte
prefix bool
)
if file, err = os.Open(path); err != nil {
return
}
reader := bufio.NewReader(file)
buffer := bytes.NewBuffer(make([]byte, 1024))
for {
if part, prefix, err = reader.ReadLine(); err != nil {
break
}
buffer.Write(part)
if !prefix {
lines = append(lines, buffer.String())
buffer.Reset()
}
}
if err == os.EOF {
err = nil
}
return
}
func main() {
lines, err := readLines("foo.txt")
if err != nil {
fmt.Println("Error: %s\n", err)
return
}
for _, line := range lines {
fmt.Println(line)
}
}
Une autre alternative pourrait être d'utiliser io.ioutil.ReadAll pour lire le fichier complet en une fois et faire le découpage par ligne ensuite. Je ne vous donne pas d'exemple explicite de la façon de réécrire les lignes dans le fichier, mais c'est en fait une façon de faire. os.Create()
suivi d'une boucle similaire à celle de l'exemple (voir main()
).
2 votes
Utilisez bufio.Scanner pour lire les lignes d'un fichier, voir stackoverflow.com/a/16615559/1136018 y golang.org/pkg/bufio