Algoritmos Fundamentales Manejo de Archivos ARCHIVOS DE DATOS Nos Permiten almacenar información de modo Permanente, acceder y modificar a la misma cuando sea necesario. Los archivos de datos se localizan en dispositivos de Almacenamiento como: disco duro, cinta, disquetes, etc. Tipo de Archivos (en este curso) : • Textos • Binarios ARCHIVOS DE DATOS En C el manejo de archivo es realizado a través del concepto de flujo (streams) o canal, también llamado secuencia. Flujo, es por donde fluyen/transportan los datos entre el programa y los dispositivos de almacenamiento. Abrir un archivo supone establecer una conexión del Programa con el dispositivo que contiene a este. Por este canal va a fluir la secuencia de datos. El acceso a archivo se hace a través de buffer donde Almacenan los datos dirigidos al archivo o desde el archivo , el buffer es como un arreglo. ARCHIVOS DE DATOS Puntero FILE Establece el área de buffer donde se va a almacenar temporalmente la información, mientras se está transfiriendo entre la memoria del computador y el archivo de datos. Abrir un Archivo Supone conectar el programa con el archivo externo y decir el modo en como va a ser tratado, y que tipo de archivo es: texto(t) o binario(b). Un archivo es abierto a través de la función fopen(), la cual devuelve un puntero a la estructura FILE. ARCHIVOS DE DATOS sintaxis fopen(nombre_archivo,modo); nombre_archivo [cadena] :nombre o identificador externo del archivo. modo [cadena] : modo de apertura o como va a ser tratado el archivo. La función fopen(), devuelve un puntero a FILE a traves del cual el programa hace referencia al archivo. Devuelve: NULL: si no puede abrir el archivo. EOF: Si la operación falla o llega a fin de archivo. ARCHIVOS DE DATOS Modo de Apertura “r” “w” “a” Sólo de lectura Salida, crear archivos, si existe se pierden sus datos. Append, para añadir al final. “r+” Lectura/escritura. (modificar) “w+” Crear archivos Lectura/escritura, si existe se pierden sus datos. “a+” Para modificar(Lectura/escritura) al final. ARCHIVOS DE DATOS Si el archivo es de texto, seria: “rt” “wt” “at” “r+t” “w+t” “a+t” Si el archivo es de binario, seria: “rb” “wb” “ab” “r+b” “w+b” “a+b” Cerrar un Archivo Se usa la función fclose(puntero_file), cierra el archivo asociado al puntero_file, devuelve EOF si ocurre un error al cerrar. Ej: sólo como abrir y cerrar un archivo. #include <stdio.h> #define NULL 0 main() { FILE *fpt; fpt=fopen(“C:\windows\muestra.txt”,”r+”); if (fpt == NULL) printf(“\n Error: No se pudo abrir archivo”); else { /*hacer algunos calculos */ ...... fclose(fpt); } } FUNCIONES DE LECTURA Y ESCRITURA (cont) fputc=putc : escribe un carácter del archivo asociado al puntero a file. fputc(c,puntero_file); devuelve EOF si no puede putc(c,puntero_file); escribir el archivo. fgetc=getc : lee un carácter en el archivo asociado al puntero a file. fgetc(puntero_file); devuelve el carácter leido ó EOF getc(puntero_file); si hay error o fin de archivo. FUNCIONES DE LECTURA Y ESCRITURA fputs() escribe una cadena en el archivo asociado al puntero a file. fputs(cadena,puntero_file); devuelve EOF si no puede escribir la cadena. fgets(): lee una cadena en el archivo asociado al puntero a file. Termina de leer cuando encuentra el carácter de fin de línea o cuando ha leido n-1 caracteres. fgets(cadena,n,puntero_file); devuelve NULL si ha habido un error. Crear un archivo a partir de otro. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MX 121 #define MN 30 int main() { FILE *entrada, *salida; char nom1[]=“cartas.dat”; char nom2[]=“primero.dat”; char cad[MX]; entrada=fopen(nom2,”rt”); salida =fopen(nom1,”at”); if (entrada == NULL || salida == NULL) { printf(“\n Error: No se pudo abrir archivo”); return 0; } while(fgets(cad,MX,entrada)) { if(strlen(cad) >=MN) fputs(cad,salida); else puts(cad); } fclose(entrada); fclose(salida); return 0; } feof() Igual a macro EOF, feof(nombre_archivo), devuelve un valor diferente de Cero 0 (true), cuando se lee el carácter de fin de archivo, de lo contrario devuelve cero 0(false); rewind() coloca el puntero del archivo al inicio de este. SINTAXIS: rewind(puntero_archivo); ARCHIVOS DE DATOS Binarios. Los archivos binarios son secuencia de 0’s y 1’s. Estos archivos optimizan la memoria ocupada por un archivo. La mayor eficiencia de los archivos binarios se contrapone con el echo de que su lectura se tiene que hacer en modo binario y que sólo se pueden visualizar desde un entorno de un programa C. ARCHIVOS DE DATOS Binarios. fwrite(): escribe un buffer de cualquier tipo de dato de un archivo binario. Sintaxis: fwrite(dirección_buffer,tamaño,num_elementos,puntero_archivo); Se dispone de una muestra de las coordenadas de puntos de un plano representada por pares de números enteros (x,y). Se desea guardar en un archivo binario estos puntos. #include <stdio.h> struct punto { int x,y; }; typedef struct punto PUNTO; ARCHIVOS DE DATOS Binarios. #include <stdio.h> struct punto { int x,y; } typedef struct punto PUNTO; int main() { PUNTO p; char *nom=“C:\PUNTOS.DAT”; FILE *pp; if ((pp=fopen(nom,”wb”))==NULL) { puts(“\n Error abriendo archivo”); return 0; } ARCHIVOS DE DATOS Binarios. puts(“\n Introduce las coordenadas, para finalizar (0 0) ”); do { scanf(“%d %d”,&p.x,&p.y); while(p.x <0 || p.y <0) { printf(“\n Coordenadas deben ser >=0 ”); scanf(“%d %d”,&p.x,&p.y); } if( p.x >0 || p.y >0) { fwrite(&p,sizeof(PUNTO),1,pp); } } while ( p.x != 0 && p.y != 0); fclose(pp); return 0; } ARCHIVOS DE DATOS Binarios. fread(): lee de un archivo n bloques de bytes y los amacena en el buffer. Sintaxis: fread(dirección_buffer,tamaño,num_bloques ,puntero_archivo); Ejemplo. Ejemplo anterior, pero leer el mismo archivo (archbin2.c) ARCHIVOS DE DATOS Acceso Aleatorios El acceso a este tipo de archivo se hace a través de su posición relativa dentro del archivo. Se pueden leer o escribir registros en cualquier orden y posición. El inconveniente de este tipo de archivo es que se necesita programar la relación existente entre el contenido de un registro y la posición que ocupan. Se usan las funciones : fseek() y ftell() las cuales consideran al archivo como una secuencia de bytes, el número de bytes es el índice del archivo. ARCHIVOS DE DATOS Acceso Aleatorios Mientras se va leyendo o escribiendo en el archivo la posición actual se guarda en un puntero. fseek() : permite cambiar la posición del puntero al archivo a una dirección determinada. Devuelve un valor entero, distinto de cero si se comete un error en su ejecución, cero si no hay error. Se puede tratar al archivo como un arreglo, la posición del archivo va a depender del desplazamiento y el origen relativo que se pasa como parámetro. ARCHIVOS DE DATOS Acceso Aleatorios Sintaxis: fseek(puntero_archivo,desplazamiento,origen); Desplazamiento: número de bytes a mover, debe ser de tipo long. Origen: es la posición a partir de la cual se cuenta el número de bytes a mover, valores que puede tener: 0: cuenta desde el inicio del archivo 1: cuenta desde la posición actual del archivo 2: Cuenta desde el final del archivo. Macro SEEK_SET SEEK_CUR SEEK_END ARCHIVOS DE DATOS Acceso Aleatorios ftell() : con esta función se obtiene la posición actual del archivo, del puntero a archivo que se pasa como parámetro. Sintaxis: ftell(puntero_archivo); La función devuelve la posición como número de byte, en entero largo (long int), desde el inicio del archivo(byte 0).