Necesito leer un archivo de enteros en una matriz. Tengo que trabajar con esto:Golang, ¿hay alguna manera mejor de leer un archivo de enteros en una matriz?
package main
import (
"fmt"
"io"
"os"
)
func readFile(filePath string) (numbers []int) {
fd, err := os.Open(filePath)
if err != nil {
panic(fmt.Sprintf("open %s: %v", filePath, err))
}
var line int
for {
_, err := fmt.Fscanf(fd, "%d\n", &line)
if err != nil {
fmt.Println(err)
if err == io.EOF {
return
}
panic(fmt.Sprintf("Scan Failed %s: %v", filePath, err))
}
numbers = append(numbers, line)
}
return
}
func main() {
numbers := readFile("numbers.txt")
fmt.Println(len(numbers))
}
El archivo numbers.txt es simplemente:
1
2
3
...
ReadFile()
parece demasiado largo (tal vez debido a la entrega de error).
¿Hay una manera más corta/más idiomática de cargar un archivo?
Te estás perdiendo 'fd.Close()'. Agregue un 'diferir fd.Close()' como la línea dos de 'readFile'. – Mostafa
Coloque 'diferir fd.Close()' después de la comprobación de errores. Obtendrá pánico de tiempo de ejecución desde esta línea cuando la lectura del archivo falle porque fd es nulo. Verifique primero el error y luego difiera su cierre. No será necesario cerrar de todos modos si no se abre. – burfl
Para aclarar, esto se debe a que los difers se evalúan inmediatamente y se ejecutan más tarde. Entonces, cuando intentes diferir fd.Close() en un fd nulo (que no tiene métodos), te entrará pánico. 'x: = 2; aplazar fmt.Print (x); x = 3 'imprimirá' 2 ', no 3. – burfl