Anuncios

Bienvenidos sean a este post, hoy veremos como escribir nuestros archivos.

Anuncios

En el post anterior vimos como leer el contenido de un archivo pero hoy nos centraremos en escribir contenido dentro de uno o crearlo en caso de ser necesario, nos daremos cuenta que escribirlo es mucho mas facil que leerlo dado que tendremos un paso menos, ya que no necesitamos recuperar la informacion sino simplemente ingresarla, para comprenderlo vamos a hacer un ejemplo y de este vamos desglosando todo.

Anuncios

Para ello crearemos un nuevo proyecto que llamaremos escribir, una vez realizado modificaremos el codigo generado en main.rs con el siguiente:

main.rs

use std::fs::File;
use std::io::prelude::*;

fn main() -> std::io::Result<()>
{
	let mut archivo = File::create("archivo.txt")?;

	archivo.write_all(b"Hola, Mundo!\n")?;

	Ok(())
}
Anuncios
Anuncios

Como pueden ver es muy similar a lo visto en el post anterior donde ahora solo tendremos dos librerias, la primera para manejar a los archivos y la segunda para manejar todo lo relacionado al codigo y pueda funcionar eficientemente, volvemos a decir que la funcion debe devolver un valor de tipo Result dado que el codigo puede fallar y debemos tener la posibilidad de notificar el error que ocurra, veamos la primer linea de nuestro codigo:

let mut archivo = File::create("archivo.txt")?;
Anuncios
Anuncios

En este caso usaremos al metodo create de la caja File, esta se encargara de crear el archivo con el nombre que pasamos entre parentesis, observen que volvemos a usar al operador de interrogacion por si ocurre alguna falla y en ese caso nos lo notificara por medio del Result, un ejemplo es que el archivo este abierto por otro proceso y no pueda ser accedido, con nuestro objeto y archivo creados vamos a proceder a escribir algo y para ello usaremos esta linea:

archivo.write_all(b"Hola, Mundo!\n")?;
Anuncios

Esta se encarga de escribir el mensaje en el archivo, la letra que esta antes del texto es para indicar que «castear» el texto a binario y el modificador \n es para indicar una nueva linea, lo bueno de este metodo es que una vez finalizada la tarea tambien libera el buffer que se utilizo para esta tarea, por ultimo tenemos la funcion Ok para indicar que todo funciono correctamente.

Anuncios
Nota: 
En el post anterior comentamos que los parentesis dentro de Ok son para indicarle a Result que usamos el mismo tipo de dato generico y no devuelva ningun error al compilarlo.
Anuncios

Si bien esta es la forma mas basica de crear un archivo esto se puede mejorar mediante OpenOptions, para ello vamos a modificar el codigo de la siguiente forma:

main.rs

use std::io::Write;
use std::fs::OpenOptions;

fn main() -> std::io::Result<()>
{
	let mut archivo = OpenOptions::new()
				.write(true)
				.create(true)
				.open("archivo.txt")
				.unwrap();

	archivo.write_all(b"Tinchicus.com\n")?;

	Ok(())
}
Anuncios

Esta es una forma mas compleja pero mejor para crear archivos, en este caso ya comenzamos con las librerias que usaremos:

use std::io::Write;
use std::fs::OpenOptions;
Anuncios

La primera sera para poder escribir en nuestros dispositivos de Entrada/Salida (Input/Output), la siguiente sera la encargada de abrir los archivos, la otra diferencia estara en el archivo que usaremos para crear nuestro archivo:

	let mut archivo = OpenOptions::new()
				.write(true)
				.create(true)
				.open("archivo.txt")
				.unwrap();
Anuncios
Anuncios

Como dijimos OpenOptions es una forma alternativa de abrir los archivos dado que nos permite definir la forma que podremos trabajar sobre ellos, lo basico es el comienzo con new, luego utilizamos write con true para permitir que se escriba, el create para permitir crearlo en caso de que no exista, lo siguiente sera pasar el archivo a abrir o crear y por ultimo usamos unwrap, que explicado brevemente sirve para enviar la notificacion a Result en caso de error, volviendo al codigo por ultimo volvemos a usar el write_all y el Ok para terminar con el codigo, si lo prueban deberia crear un nuevo archivo.

Anuncios
Nota:
Les recomiendo borrar el archivo si existe del primer ejemplo.
Anuncios

Pero este codigo se puede mejorar un poco mas, si en el bloque anterior hacemos la siguiente modificacion:

	let mut archivo = OpenOptions::new()
				.write(true)
				.create(true)
				.open("archivo.txt")
				.expect("Fallo la apertura del archivo");
Anuncios

Es muy similar al anterior pero en esta ocasion reemplazamos al unwrap por expect, hacen basicamente lo mismo pero en el caso de expect podemos personalizarlo con un mensaje para identificarlo mejor, por esta razon este metodo es mas popular que unwrap, veamos como quedo el codigo final de main.rs:

main.rs

use std::io::Write;
use std::fs::OpenOptions;

fn main() -> std::io::Result<()>
{
	let mut archivo = OpenOptions::new()
				.write(true)
				.create(true)
				.open("archivo.txt")
				.expect("Fallo la apertura del archivo");

	archivo.write_all(b"Tinchicus.com\n")?;

	Ok(())
}
Anuncios

Vamos a probarlo para verlo en accion mediante el siguiente video

Anuncios
Nota:
En otro post hablaremos a fondo sobre OpenOptions porque es un metodo muy interesante.
Anuncios

En resumen, hoy hemos visto como escribir archivos, ya sea desde un simple codigo por medio de File::create, luego lo modificamos para hacerlo por medio de OpenOptions, por ultimo hemos visto la diferencia entre unwrap y expect, espero les haya sido de utilidad sigueme 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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50