DMarlon Studio

Lección 19 · 19 de 20

Escribir y leer archivos · Go

Escriba y lea archivos de texto en Go con el paquete os: WriteFile, OpenFile para añadir, Open con bufio.Scanner y defer para cerrar.

Go · Escribir y leer archivos en DMarlon Studio: el código del ejemplo y su salida en la terminal

os.WriteFile crea un archivo (o lo sustituye si ya existía) con el contenido que se le pase, convertido en bytes con []byte(notes). 0644 son los permisos del archivo en sistemas tipo Unix: lectura y escritura para usted, solo lectura para los demás. El nombre notes.txt, sin carpeta, lo deja en la carpeta actual.

Casi todo lo que toca archivos puede fallar, así que devuelve un error. La función check evita repetir la misma comprobación: si err no es nil, lo escribe y termina el programa con os.Exit(1).

Para añadir sin borrar lo que hay, os.OpenFile abre el archivo con os.O_APPEND|os.O_WRONLY: escribir al final y solo escribir. fmt.Fprintln(f, ...) funciona como Println, pero escribe en el archivo f. Después, f.Close() lo cierra.

os.Open abre el archivo para leerlo y un bufio.Scanner, como el de la lección 5, lo recorre línea a línea: for n := 1; scanner.Scan(); n++ numera las líneas mientras queden. `defer` aplaza file.Close() hasta que termina main; es la forma habitual de no olvidarse de cerrar un archivo. Para leerlo entero de una vez también existe os.ReadFile.

Código · main.go

package mainimport (	"bufio"	"fmt"	"os")// check stops the program if something went wrong.func check(err error) {	if err != nil {		fmt.Println("Error:", err)		os.Exit(1)	}}func main() {	// WriteFile creates (or replaces) a file in the current folder.	notes := "Buy bread\nCall the plumber\nWater the plants\n"	check(os.WriteFile("notes.txt", []byte(notes), 0644))	// OpenFile with O_APPEND adds lines at the end.	f, err := os.OpenFile("notes.txt", os.O_APPEND|os.O_WRONLY, 0644)	check(err)	fmt.Fprintln(f, "Pay the electricity bill")	f.Close()	// Open + bufio.Scanner reads it back line by line.	file, err := os.Open("notes.txt")	check(err)	defer file.Close() // runs when main ends	scanner := bufio.NewScanner(file)	for n := 1; scanner.Scan(); n++ {		fmt.Printf("%d. %s\n", n, scanner.Text())	}}

Salida · go run main.go

1. Buy bread
2. Call the plumber
3. Water the plants
4. Pay the electricity bill

Para recordar

  • os.WriteFile crea o sustituye un archivo.
  • os.OpenFile con os.O_APPEND añade al final.
  • fmt.Fprintln(f, ...) escribe en un archivo.
  • os.Open y bufio.Scanner leen línea a línea.
  • defer f.Close() cierra el archivo al terminar la función.

Ejercicio

Escriba un archivo prices.txt con un precio por línea, léalo con un Scanner, convierta cada línea con strconv.ParseFloat y escriba la suma.