Programación Estructurada PROGRAMACIÓN ESTRUCTURADA Sesión No. 11 Nombre: Manejo de archivos Contextualización En los lenguajes de programación estructurada como C, que carecían de una conexión a base de datos, era difícil utilizar solo contenedores como variables, arreglos o estructuras robustas que contuvieran una gran numero de información, para solucionar muchas de estas necesidades se implementó una metodología de manejo de archivos. La intención de utilizar archivos como fuentes de datos o incluso, como repositorio de información, surge a partir de los grandes programas que requerían un gran número de información o detalle de información, que, al tratar de almacenar en arreglos multidimensionales tipo banco de datos, absorbían mucha memoria y ralentizaban los programas. La llegada de los ficheros a los lenguajes de programación, ayudo con esta carga de datos, permitiendo un manejo más robusto de la información. 1 PROGRAMACIÓN ESTRUCTURADA Introducción al Tema En sesiones anteriores se detalló el uso de las diferentes estructuras de almacenamiento de datos, así como su uso e implementación, si bien la capacidad para manejar la información y trabajarla en contenedores temporales es robusta, no siempre es la mejor forma de trabajar en cuanto a lenguaje de programación estructurada se trata. En el caso de programas robustos como los sistemas bancarios de hace muchos años, la información que se manejaba era muchísima, y se requería de grandes tamaños de memoria para poder correr programas de forma óptima, esto, debido a las estructuras que consumían memoria para trabajar con datos que durarían mucho tiempo en el programa ejecutable. La metodología sobre el manejo de ficheros, vino a solucionar grandes problemas de consumo de memoria, ya que su implementación consiste en crear un documento y escribir en él, almacenándolo en un espacio reservado al cual apunta un puntero particular para trabajar sobre la información que el contiene. En esta sesión encontrarás la forma de trabajar con ficheros en el lenguaje C, sus operaciones básicas y los tipos de fichero con los que se puede trabajar. 2 PROGRAMACIÓN ESTRUCTURADA Explicación 6.1 Operaciones básicas Antes de comenzar se debe hacer una aclaración en caso de que no estés familiarizado con la palabra fichero (debido a que ya es un término casi olvidado). Un fichero es conocido también como archivo, y es un conjunto de bits que se almacenan en un dispositivo de almacenamiento, por ejemplo el disco duro de una computadora. El manejo de archivos en C se realiza a través de los punteros de fichero, es decir, obteniendo la dirección en memoria de donde se encuentra el archivo. Cada vez que se va a utilizar un fichero, es preciso definir primero un puntero a fichero de la siguiente forma: #include <stdio.h> File * FilePointer; El puntero de fichero apunta a una estructura que define varios aspectos internos del archivo, entre las que se incluye su nombre, su estado y la posición actual. En esencia, el puntero de archivo identifica un archivo de disco duro, así como el stream asociado a él. Las operaciones básicas con archivos son: lectura y escritura. Abrir un archivo. Para poder trabajar con archivos se deben cumplir los siguientes pasos: 1. Definir un apuntador tipo FILE 2. Utilizar la función fopen(); para abrir el documento. 3. Definir la operación sobre el archivo (lectura, escritura etc.) 4. Cerrar el archivo utilizando la función fclose(); 3 PROGRAMACIÓN ESTRUCTURADA Sintaxis: Para poder trabajar con los archivos existen diferentes tipos de acciones que deben ser declarados en la invocación del fopen(); las acciones pueden invocarse del siguiente modo: Modo "r" "w" "a" "r+" "rb" "wb" "ab" "r+b" "w+b" "a+b" "rt" "wt" "at" "r+t" "w+t" "a+t" Significado Abrir fichero para lectura. Abrir fichero para escritura. Si el fichero no existe, es creado. Si existe su contenido, es limpiado. Abrir fichero para añadir Abrir archivo para lectura. Abrir archivo binario para leer. Abrir fichero binario para escritura. Abrir fichero binario para añadir. Abrir fichero para lectura / escritura. Abrir fichero para lectura / escritura. El archivo es creado además. Añadir a un archivo binario o creado para lectura / escritura. Abrir archivo de texto para leer. Abrir fichero de texto para escritura. Abrir fichero de texto para añadir. Abrir archivo de texto para lectura / escritura. Abrir archivo de texto para lectura / escritura. El archivo es creado además. Añadir a un archivo de texto o crearlo para la lectura / escritura. Cuando no se especifica la “t” de texto o la “b” de binario se toma el valor que tenga la variable global_fmode. Esta variable suele tener por defecto el valor o_text, aunque puede asignársele el valor de o_BINARY. 4 PROGRAMACIÓN ESTRUCTURADA Un fichero se cierra mediante la función fclose(); que tiene la siguiente sintaxis: Int fclose (FILE *filepointer); Esta función recibe el puntero al archivo que deseamos cerrar y devuelve un valor de 0 si la operación tiene éxito. Ejemplo: #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { FILE *fp; fp = fopen ( "fichero.in", "r" ); if (fp==NULL) {fputs ("File error",stderr); exit (1);} fclose ( fp ); return 0; } En este ejemplo se utilizó el tipo opentype r para poder leer el archivo únicamente. Como podrás observar, se valida si el retorno de la función fue de tipo NULL, lo cual significaría que el archivo no existe. 5 PROGRAMACIÓN ESTRUCTURADA Lectura de un archivo o fichero. Existen varias funciones para poder leer un archivo: feof(); Busca el fin del documento, como ya se comentó, todos los archivos terminan con el carácter especial EOF (end of file), feof() devuelve un valor verdadero si encuentra el carácter EOF en la posición actual del puntero. rewind(); regresa el cursor de lectura del archivo al inicio, es decir, regresa al inicio del documento. fgetc(); Lee un carácter del archivo justo donde se encuentra el cursor. Para poder leer un documento completo se deberá hacer un ciclo repetitivo que incluya esta función hasta que el carácter leído sea el fin de línea (EOF). Ejemplo: #include <stdio.h> #include <stdlib.h> int main() { FILE *archivo; char caracter; archivo = fopen("miArchivo.txt","r"); if (archivo == NULL){ printf("\No se encontro el archivo. \n\n"); }else{ printf("\nEl contenido del archivo es \n\n"); while (feof(archivo) == 0) { caracter = fgetc(archivo); printf("%c",caracter); 6 PROGRAMACIÓN ESTRUCTURADA } } fclose(archivo); return 0; } fgets(); esta función también se encarga de leer el archivo, sólo que en lugar de leer carácter por carácter toma cadenas de caracteres. Escritura en archivos o ficheros. fputc(); escribe un carácter a la vez en un archivo. fputs(); escribe una cadena de caracteres en un archivo. fwrite(); esta función permite escribir registros de longitud constante permitiendo volcar a partir de datos almacenados en la memoria. fprintf(); esta función trabaja exactamente igual que printf(); solo que su objetivo de escritura es un archivo en lugar de imprimir en pantalla. Ejemplo: #include <stdio.h> int main ( int argc, char **argv ) { FILE *fp; char buffer[100] = "Esto es un texto dentro del fichero."; fp = fopen ( "fichero.txt", "r+" ); fprintf(fp, buffer); fprintf(fp, "%s", "\nEsto es otro texto dentro del fichero."); fclose ( fp ); return 0; } 7 PROGRAMACIÓN ESTRUCTURADA 6.2 Texto y binarios Existen dos tipos de archivos con los que se puede trabajar en C, los archivos de texto y los archivos binarios. Los archivos de texto. Son una secuencia de cadenas de caracteres cuyo final se determina por el carácter especial EOF. En este tipo de archivos, se suele guardar información de tipo plano o bases de datos simples, es decir un contenido estructurado de valores fáciles de leer y entender por el usuario pues son caracteres tipo texto. Los Archivos binarios Desde el punto de vista del programador, los archivos se deben ver como una cadena de bits (0 a 1) agrupados en bytes consecutivos, de los cuales, el ultimo, es un carácter especial (EOF) que indica que no existen más bytes a partir de él. Los programas manejan estos bytes de diversas formas dependiendo la codificación que haya sido utilizada para crear los ficheros, es decir, los bytes pueden representar números enteros, números reales, caracteres, direcciones de memoria, etc. En ambos casos, los archivos son cadenas de bytes terminadas por el carácter EOF. La diferencia radica en cómo el programa que trata con el fichero va a interpretar la información contenida en él. Una vez creado un archivo y la información escrita en él se haya hecho como texto o como binario, en lo sucesivo, habrá que trabajar siempre del mismo modo, es decir, no podrá cambiar la forma de leer / escribir información de / en él. 8 PROGRAMACIÓN ESTRUCTURADA En el caso concreto de MS- DOS, los archivos vienen identificados por un nombre que ha de tener un máximo de 8 caracteres y una extensión separada del nombre por punto que es opcional y ha de tener un máximo de 3 caracteres. Además, es posible especificar el dispositivo en el cual está y el camino de acceso a dicho archivo a través de los directorios. 9 PROGRAMACIÓN ESTRUCTURADA Conclusión Los programas que utilizan como fuente de datos a los ficheros, son archivos potentes cuya principal necesidad es la lectura y almacenaje de grandes cantidades de datos, permitiendo resguardar la información en archivos sin necesidad de recurrir todo el tiempo a espacios de memoria que ralentizan el programa en ejecución a la larga. Los archivos más utilizados son los de tipo texto y se utilizan comúnmente para hacer una emulación de base de datos, conteniendo en ellos, grandes cantidades de cadenas de texto previamente planeadas y ordenadas. 10 PROGRAMACIÓN ESTRUCTURADA Para aprender más En el siguiente link, encontrarás un video donde se detalla paso a paso, como es que se pueden utilizar los ficheros en un programa desarrollado en lenguaje C. En él se explica desde la creación de los archivos a consultar y las funciones para abrirlo leerlo y escribir en él, todo, paso a paso en un programa real. https://www.youtube.com/watch?v=ztEsa-dtn3E 1 1 Video tomado de YouTube en la liga: https://www.youtube.com/watch?v=ztEsa- dtn3E 11 PROGRAMACIÓN ESTRUCTURADA Actividad de Aprendizaje Con la finalidad de reforzar los conocimientos adquiridos a lo largo de esta sesión, ahora tendrás que realizar la siguiente actividad. Instrucciones Escribe un ejemplo de un programa básico en C donde abras un archivo de tipo texto y se escriba en el tu nombre mediante un código de escritura en el archivo. Imprimir la pantalla ya que esté escrito en C Convertir en imagen en formato JPG el programa realizado Subirlo a la plataforma de la asignatura Esta actividad te ayudará a comprender los diferentes tipos de archivos que existen en el lenguaje C, así como su correcta utilización, lo cual te facilitará a entender las siguientes sesiones. Esta actividad representa el 5% de tu calificación y se tomará en cuenta lo siguiente: Tus datos generales. Título. Ejemplo de programa básico en C con tu nombre mediante un código. Ortografía y redacción. Referencias bibliográficas 12 PROGRAMACIÓN ESTRUCTURADA Bibliografía Badenas, J; (2001). Curso práctico de programación en C y C++, Castello de la Plana: Universidad Jaume I. Cobo A; (s/f). Programar C desde un punto de vista científico, Madrid: Visión Libros Harvey, M; (2004), C / C++ y Java cómo programar, México: Pearson Educación. Jordá, P; (s/f). Diseño e implementación de programas en lenguaje C, Valencia: Universidad Politécnica de Valencia. Oviedo, R; (2004), Lógica de programación, Bogotá: Ecoe Ediciones 13