Bienvenidos sean a este post, continuando con la libreria I/O para tener un mejor control sobre los archivos podemos usar el modelo completo.

Anuncios

Un concepto central en este modelo para el manejo del archivo, lo cual es equivalente a streams(FILE*) en C esto representa a un archivo abierto con una posicion actual, para abrir un archivo se usa la funcion io.open la cual imita a la funcion fopen en C, este toma como argumento el nombre del archivo a abrir ademas de una cadena de modo, estas pueden ser:

  • r, para lectura
  • w, para escritura (tambien se encarga de borrar todo el contenido previo del archivo),
  • a, para agregar (no borra el contenido previo del archivo sino que lo agrega a partir del final del mismo)
  • b, para abrir archivos binarios, la funcion open devuelve un identificador para el archivo
Anuncios

En el caso de generarse un error el metodo open devuelve:

  • un valor nil
  • un mensaje de error
  • un numero de error
Anuncios

Veamos un par de ejemplos:

> print(io.open("archivo-no-existente","r"))
nil     archivo-no-existente: No such file or directory 2
> print(io.open("/etc/passwd", "w"))
nil     /etc/passwd: Permission denied  13
Anuncios

La interpretacion de los numeros de error dependen del sistema, una forma tipica de chequear un error es:

local f = assert(io.open(archivo, modo))
Anuncios

Si open falla el mensaje de error va como el segundo argumento a assert, lo cual luego te mostrara el mensaje, despues de abrir un archivo puedes leerlo o escribirlo con los metodos read/write respectivamente, ellos son similares a las funciones read/write pero los podes llamar como metodos en el manejo del archivo, usando la sintaxis del separador (:), por ejemplo para abrir un archivo y leer todo podes usar un chunk como este:

local f = assert(io.open(archivo, "r"))
local t = f:read("*all")
f:close()
Anuncios

Esta libreria ofrece formas de manejar para los tres streams predefinidos de C:

  • io.stdin
  • io.stdout
  • io.stderr
Anuncios

Asi que podes enviar un mensaje directamente al stream de error con un codigo como este:

io.stderr:write(mensaje)
Anuncios

Esto nos da la posibilidad de poder mezclar el metodo completo con el metodo simple, conseguimos el archivo de entrada actual manejado por la llamada io.input sin argumentos, configuramos este manejador con la llamada a io.input(manejador), llamadas similares son tambien validas para io.output, por ejemplo si queres cambiar el archivo de entrada actual temporalmente y para ello podemos usar el codigo siguiente:

local temp = io.input()
io.input("nuevaentrada")
< hacemos algo con la nueva entrada >
io.input():close()
io.input(temp)
Anuncios

La primera linea se encarga de guardar el actual archivo de entrada, la segunda linea se encarga de asignar un nuevo archivo de entrada, despues tenemos el bloque donde haremos todo lo que necesitemos sobre el nuevo archivo de entrada, para luego cerrar el archivo nuevo que abrimos y por ultimo restauramos el archivo que teniamos al inicio.

Anuncios

En resumen, hoy hemos visto como es el modelo completo de la libreria I/O, cuales son los beneficios de trabajar con este modelo, como poder manejar errores, vimos como se puede mezclar entre el modelo simple y el modelo completo, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00