Bienvenidos sean a este post, en este post veremos como leer el contenido de un archivo.
Para comenzar con esto vamos a generar un nuevo ejemplo y desde el codigo iremos explicando todos lo minimo para leer un archivo, para ello deben hacer un nuevo proyecto que llamaremos leer, una vez creado iremos dentro del directorio del proyecto y crearemos un archivo llamado texto.txt y en ese archivo agregaremos el siguiente texto:
texto.txt
Tinchicus.com es el mejor lugar para aprender.
Nuestro siguiente paso sera modificar el codigo generado en main.rs con el siguiente:
main.rs
use std::io::BufReader;
use std::io::prelude::*;
use std::fs::File;
fn main() -> std::io::Result<()>
{
let archivo = File::open("texto.txt")?;
let mut lector = BufReader::new(archivo);
let mut cdn_buff = String::new();
lector.read_line(&mut cdn_buff)?;
println!("Linea leida: {}", cdn_buff);
Ok(())
}
Este es un codigo simple pero efectivo, analicemos la primera parte:
use std::io::BufReader;
use std::io::prelude::*;
use std::fs::File;
Aqui tenemos nuestras librerias que utilizaremos, la primera es una distinta a las mencionadas en el post anterior, la cual nos servira para hacer la «magia» con nuestros archivos pero ya hablaremos sobre esto, los otros se encargaran de importar todo lo que se necesita en el codigo de Rust (prelude) y la otra la usaremos para gestionar el acceso a los archivos, la siguiente variacion la haremos en el main donde agregaremos lo siguiente:
fn main() -> std::io::Result<()>
En este caso le decimos que debe devolver un dato de tipo Result, esto es debido a que no solamente vamos a manejar el contenido del archivo sino que tambien la posibilidad de un error, por ejemplo que el archivo no exista o este siendo utilizado, para esos casos nos devolvera el error y sabremos porque fallo.
Lo siguiente sera abrir el archivo y para ello lo primero que debemos hacer es usar la siguiente linea:
let archivo = File::open("texto.txt")?;
En este caso utilizamos a File::open y pasamos el archivo que queremos abrir, esto lo almacenamos en una variable llamada archivo, al final tiene un signo de interrogacion que resumiendo su funcion es simplemente para el caso de que ocurra algun error nos lo notifique por medio del Result anterior, pero esta funcion podemos usarlo con dos funciones como son try y match, veamos primero como la usaremos con try:
let archivo = try!(File::open("archivo.txt"));
En este caso con la macro try interceptaremos cualquier error, pero de esto hablaremos mas adelante, y en todo caso no lo cargara y notificaremos el error de lo contrario lo abrira sin notificar nada, el siguiente caso es:
let archivo = match File::open("texto.txt")
{
Ok(archivo) => archivo,
Err(..) => panic!("Oh my god!"),
}
En este caso por medio de match usamos a la opcion de abrir archivo, luego tenemos dos opciones donde Ok sera para cuando se abre correctamente el archivo y el otro es por si ocurre alguna falla notificandola, suponiendo que no hubo ninguna falla y el archivo fue abierto correctamente debemos a almacenar el contendio en un buffer, en este caso usaremos a BufReader, para ello usaremos el siguiente bloque:
let mut lector = BufReader::new(archivo);
let mut cdn_buff = String::new();
lector.read_line(&mut cdn_buff)?;
Primero crearemos un objeto de tipo BufReader y le pasaremos el archivo que abrimos anteriormente, luego generamos otra variable de tipo String que sera mutable y vacia, lo siguiente sera usar a read_line para que lea el contenido almacenado en lector al comienzo del bloque, observen que en este caso volvemos a usar el signo de interrogacion, para exactamente lo mismo que antes, por ultimo tenemos estas dos lineas:
println!("Linea leida: {}", cdn_buff);
Ok(())
En este caso tenemos una linea para mostrar lo obtenido por medio del read_line y almacenado en la variable cdn_buff, por ultimo utilizamos el Ok para informar que salio todo bien, observemos como pasamos los parentesis, esto es debido a que lo utilizamos en el Result para que utilice valores de tipo genericos, asi podemos pasar el dato obtenido o el error en caso de ser asi, con todo el codigo comentado probemos de compilarlo y ejecutarlo para ver su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/leer$ cargo build; cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/leer`
Linea leida: Tinchicus.com es el mejor lugar para aprender.
tinchicus@dbn001vrt:~/lenguajes/rust/leer$
Como pueden ver funciono perfectamente libre de errores o avisos, como dije esta es una estructura basica de archivos pero podemos agregar mas cosas o simplificar otras, por ejemplo vamos a tomar el codigo anterior y vamos a modificarlo para utilizar a match al momento de abrir el archivo:
main.rs
use std::io::BufReader;
use std::io::prelude::*;
use std::fs::File;
fn main() -> std::io::Result<()>
{
let archivo = match File::open("texto.txt")
{
Ok(archivo) => archivo,
Err(..) => panic!("Oh my god!"),
};
let mut lector = BufReader::new(archivo);
let mut cdn_buff = String::new();
lector.read_line(&mut cdn_buff)?;
println!("Linea leida: {}", cdn_buff);
Ok(())
}
El codigo es similar al anterior pero la unica diferencia esta a la hora de abrir el archivo, donde utilizamos a match y observen que ahora vamos a tener una forma distinta de notificarlo, el resto se mantiene exactamente igual pero aca podriamos agregar mas opciones para poder manejarlo mejor, con esto ya saben como abrir un archivo y volcar su contenido en pantalla.
En resumen, hoy hemos visto como leer archivos, todos los pasos necesarios para hacerlo, hemos visto un ejemplo donde explicamos el paso a paso, vimos el resultado y por ultimo vimos un codigo aplicando a match para capturar un posible error, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
