Cap tulo 1
Manipulacin de archivos o estructurados
1.1. Introduccin o
Denicin Un archivo es un medio de almacenamiento no voltil, es decir o a permanece luego de terminar la aplicacin que la utiliza o luego de apagar el o computador. Un archivo se almacena en memoria secundaria como el disco duro, cd, dvd, etc. Los archivos llevan asociado un nombre y una extensin, sta ultima permite o e identicar el tipo del archivo, por ejemplo doc, jpg, bmp, cpp, etc. Los archivos estructurados se caracterizan por que almacenan los datos respetando un patrn espec o co que ocupa un determinado espacio. Una de las aplicaciones ms comunes en la que se utiliza archivos estructurados es el de a las bases de datos. Supongamos que deseamos almacenar datos de libros en un archivo, entonces los datos se estructurarn de acuerdo a lo que interesa almaa cenar de cada libro, en este caso podemos necesitar representar el t tulo, autor, ao de edicin, ISBN y editorial. Entonces un conjunto de datos de varios libros n o se vern como en la gura 1.1. a Cada uno de los libros en el archivo se representa por un registro. Todos los registros del archivo se almacenan siguiendo una estructura (struct en C o C++), discutiremos en la siguiente seccin cmo crear una estructura para los o o registros, seguiremos usando el ejemplo del libro.
1.2.
Estructuras (struct)
Supongamos que tenemos la siguiente estructura para cada registro de libro: -------------------------------------------------ISBN | TITULO | AUTOR |ANIO EDICION | EDITORIAL -------------------------------------------------Lo primero es determinar el tipo de dato de cada elemento de la estructura, cada elemento se denomina campo, en el ejemplo hay 5 campos. 1
CAP ITULO 1. MANIPULACION DE ARCHIVOS ESTRUCTURADOS
Figura 1.1: Vista lgica de un archivo de registros de libros. o ISBN: un entero TITULO: cadena de 20 AUTOR: cadena de 20 ANIO EDICION: entero EDITORIAL: cadena de 20 La implementacin en C o C++ es como sigue: o typedef struct Libro { int ISBN; char titulo[20]; char autor[20]; int anio; char editorial[20]; }TLibro; donde TLibro se utiliza como un nuevo tipo de dato que representa un tipo para cada libro, entonces un libro en particular se puede denir como: LIBRO miLibro; y para acceder a cada uno de sus campos utilizaremos el operador punto (.), por ejemplo: [Link]=2344; [Link]="C y C++"; [Link]="D. Ritchie"; [Link]=1999; [Link]="Alfa"; Ahora, utilizaremos un archivo para guardar cada registro, esto lo veremos en la siguiente seccin. o
1.3. OPERACIONES CON ARCHIVOS
1.3.
Operaciones con archivos
Para manipular un archivo utilizaremos el tipo FILE (en realidad crearemos un puntero de tipo FILE) y usaremos las siguientes funciones de stdlib.h. fopen: Para abrir un archivo y asociarlo con un puntero de tipo FILE. La sintaxis es como sigue: FILE *fopen(char *nombre, char *modo) donde nombre es el nombre del archivo, en el que se puede incluir la ruta y modo indica la forma en que puede usarse el archivo: w Para crear un archivo. r Para leer un archivo. a Para aadir datos al archivo. Ejemplo: FILE *f = fopen("[Link]","r"); fread: Lee datos del archivo y los pasa a la memoria principal. fread(void *puntero, size_t tamanyo, size_t nmemb, FILE *f) donde puntero indica el espacio de memoria en dnde se almacenarn los o a datos, tamanyo es la cantidad de bytes a leer, nmemb es la cantidad de veces que se leer (asumiremos igual a 1), y f representa el archivo. a fwrite: Lee datos de la memoria principal y los pasa al archivo. fwrite(void *puntero, size_t tamanyo, size_t nmemb, FILE *f) donde puntero indica el espacio de memoria desde dnde se leeran los o datos, tamanyo es la cantidad de bytes a escribir, nmemb es la cantidad de veces que se escribirn (asumiremos igual a 1), y f representa el archivo. a fseek: Permite ubicarnos en cualquier posicin del archivo para actualizar o datos. int fseek(FILE *f, long int desplazamiento, int origen); La funcin fseek activa el indicador de posicin de cheros de f y los deo splaza sen el parmetro desplazamiento donde la posicin inicial es oriu a o gen. Se puede utilizar las constantes SEEK SET para indicar como origen el inicio, SEEK CUR en caso de que origen sea la posicin actual o y SEEK END si es el nal. Frecuentemente desplazamiento es un valor obtenido mediante una llamada a la funcin ftell. Por ejemplo, si se tiene o la posicin de un registro X, entonces en cualquier momento podemos o regresar a ubicarnos en ese registro y actualizar sus dato. ftell: La funcin ftell obtiene el valor actual del indicador de posicin de o o chero para un determinado archivo. long int ftell(FILE *f);
CAP ITULO 1. MANIPULACION DE ARCHIVOS ESTRUCTURADOS
1.4.
Implementacion de las operaciones
Siguiendo con nuestra pol tica de implementar un programa modularmente, crearemos dos mdulos, uno para guardar un registro y otro para reportar todos o los registro del archivo. GUARDAR void guardarLibro(TLibro L, FILE *f) { fwrite(&L,sizeof(TLibro),1,f); } REPORTAR void reportarLibro(char *file) { FILE *f=fopen(file,"r"); TLibro L; if (f!=NULL) { fread(&L,sizeof(TLibro),1,f); while(!feof(f)) { imprimir(L); fread(&L,sizeof(TLibro),1,f); } } else { printf( "Error al abrir el archivo \n" ); exit(1); } fclose(f); } En el mdulo anterior usamos la funcin feof() para determinar si ya se ha le o o do el nal del archivo. Adems usamos el mdulo imprimir para mostrar los datos: a o void imprimir(TLibro { printf("ISBN : %s printf("Titulo: %s printf("Anio : %s printf("Anio : %d printf("Anio : %s } L) \n", \n", \n", \n", \n", [Link]); [Link]); [Link]); [Link]); [Link]);
1.5.
Implementacin completa o
Se adjunta la implementacin completa para guardar y reportar datos de un o archivo.
1.6. EJERCICIOS
1.6.
Ejercicios
Utilizando el cdigo base de la seccin anterior, agregue lo necesario para o o que el programa soporte bsqueda de un libro por ISBN, es decir se da u el ISBN y el programa debe devolver los datos completos del libro si lo encuentra o un mensaje de error si no se encuntra un libro con tal ISBN. Complete el cdigo anterior de modo que su programa soporte modio cacin de datos. Por ejemplo supongamos que se desee modicar los datos o del autor de un libro con ISBN determinado.