Bienvenidos sean a este post, hoy veremos de forma teorica como se trabaja con archivos.
Hasta ahora hemos visto como trabajar con streams pero como podemos hacer para trabajar con informacion persistente, en este caso entran los archivos y estos nos dan la capacidad de almacenar y recuperar informacion en cualquier momento, a su vez podemos intercambiar informacion entre distintos programas mediante los archivos, por eso comencemos con el tema.
Repasemos que es un stream, no es otra cosa que una transferencia de informacion entre un origen y un destino siempre en la misma direccion, a su vez podemos considerarlo como orientado a dispositivos porque tenemos al teclado y el monitor que representan al stdin y stdout de manera predeterminada respectivamente, un archivo no deja de ser un dispositivo abstracto de almacenamiento de datos, la buena noticia es que todo es invisible para nosotros dado que cada vez que corremos un programa todas las conexiones para stdin, stdout y stderr son realizadas automaticamente por nuestra librerias de rutinas de C, en cambio para cualquier otro tipo de conexion a un stream debe ser realizada por nosotros, por parte del lenguaje tenemos dos tipos de stream:
- texto, este consiste de lineas de bytes principalmente de caracteres imprimibles en el rango de 32 a 128 (las cuales pueden ser legibles por los humanos) y como restriccion cada final de linea debemos agregar el caracter de ‘\n‘ (nueva linea)
- binario, este es mas orientado a bytes y solo es intelegible para otros programas.
A los streams de texto tambien se los denomina como stream de acceso secuencial porque cada linea puede variar en longitud, dado que seria casi imposible ubicar al archivo al comienzo de cualquier linea con un simple limitador, por esta razon el archivo debe ser leido desde el comienzo hasta el final para ser interpretado correctamente, aunque les parezca mentira los hemos estado utilizado desde el primer post que vimos en este blog, dado que los stream de texto son manipulados con scanf, printf y las otras fuunciones relacionadas, y los stream binarios son los programas que compilamos y ejecutamos en nuestra terminal.
Los streams binarios tambien tienen otra denominacion, stream de acceso random, y tal como dijimos un ejemplo pueden ser nuestros archivos ejecutables compilados de nuestros codigos, este tipo de stream a diferencia del anterior es mas similar a un array de estructuras donde un limite al comienzo de cada estructura puede ser el calculo de un numero de registo X y el tamaño del registro, la recuperacion de registros individuales es hecha directamente y relativamente mas rapida que el otro, y estan orientadas a sistemas de procesamiento de transacciones.
Recuerdan cuando hablamos de stream en este post hablamos de FILE muy superficialmente, pero de este tenemos los siguientes requerimientos para controlar el stream:
- Indicador actual de posicion, este es importante si el disposito tiene un principio y un final, tal como un archivo
- Indicador de final del archivo (EOF), para indicar si es el final del archivo
- Indicador de error, se usa para mostrar si ocurrio un error
- Buffer de datos, cuando trabaja en modo buffer, los datos son almacennados termporalmente aqui
- Estado de buffer, nos indica cual tipo de buffer utilizamos
- Modo E/S, indica si es un stream de entrada, salida y actualizacion (*)
- Modo binartio o texto, indica el modo de stream
- Idenntificador de dispositivo E/S, identificador especifico de la plataforma de un dispositivo asociado de E/S
(*) El modo actualizacion ejecuta tanto la entrada como la salida pero necesita manipulacion avanzada de archivos para ser usada apropiadamente
Cada una de estas acciones no son realizadas por nosotros directamente sino que lo realizaremos por medio de funciones, pero de ellas hablaremos a continuacion:
- fopen, por medio de un nombre de archivo y modo nos permite abrir/crear un stream
- freopen, cierra el steam informado y lo vuelve abrir con el nuevo nombre de archivo
- fclose, cierra el stream
- fflush, para stream de salida o actualizacion, se encarga de limpiar cualquier buffer en el dispositivo
- fpurge, es similar a la anterior pero no esta estandarizada
- feof, chequea si se llego al final del archivo
- ferror, nos permite chequear por cualquier error
- clearerr, nos sirve para limpiar cualquier condicion de error
Al comienzo mencionamos que debiamos pasar el modo para fopen, veamos los que tenemos disponibles:
- r, nos permite abrir un archivo como solo lectura, falla si no existe el archivo
- w, abre el archivo para escritura, si el archivo existe se pierde toda su informacion de lo contraria genera al archivo
- a, abre el archivo para agregar informacion, si el archivo existe agrega el contenido a partir del final del archivo de lo contrario lo crea
- b, nos permite trabajar el archivo como binario
Estos se denominan como modos de un solo sentido, dado que si lo utilizamos de esta forma solo podremos hacer una sola accion, ya sea leer o escribir, pero podemos hacer mas de una tarea, para ello debemos usar el simbolo de mas (+) para unirlos, por ejemplo:
- r+
- w+
- a+
Estos en cambio se denomina como nodos de dos sentidos pero a su vez tambien podemos hacer esto con el modo binario:
- rb
- wb
- ab
Como se pueden imaginar estos son los modos de un solo sentido para los modos de doble sentido se usan de la siguiente forma:
- r+b
- wb+
- a+b
Ahora veamos las funciones que disponemos para utilizar en cada tipo de stream, estas son para los stream de texto:
- fprintf, escribe texto formateado en el stream de salida
- fscanf, lee e interpreta texto formateado del stream de entrada
- fputs, escribe un texto sin formatear en el stream de salida
- fgets, lee un texto sin formatear del stream de entrada
A continuacion veremos unas funciones parecidas pero orientadas a un solo caracter:
- fgetc, lee un solo caracter desde el stream de entrada
- fputc, escribe un solo caracter al stream de salida
- ungetc, pone un solo caracter devuelta en el stream de entrada
A continuacion veremos las funciones que nos permiten trabajar con archivos:
- fread, lee un bloque de datos de un tamaño especificado desde un archivo
- fwrite, escribe un bloque de datos de un tamaño especifico en un archivo
- ftell o fgetpos, nos devuelve la posicion actual del archivo
- fseek o fsetpos, mueve la posicion actual a una posicion especificada del archivo
- rewind, mueve la posicion actual al inicio del archivo
- remove, elimina un archivo
- rename, renombra un archivo
En el proximo post nos encargaremos de ver un poco mas sobre estos, por ultimo algunas de las posibles fallas o errores que podemos tener a la hora de trabajar con archivos son causadas por falta de permisos sobre estos, una buena practica es siempre cerrar los archivos antes de salir del programa, asi como tambien siempre limpiar los buffers.
En resumen, hoy hemos visto como trabajar con archivos en forma teorica, repasamos un poco sobre los streams, hemos visto algunas de las funciones que disponemos para poder trabajar con ellos, asi como se componen, sus distintos modos y otros temas, en el proximo post veremos como trabajar con ellos, 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
