PROGRAMACIÓN laboratorio 2007-1 PRÁCTICA 11. ARCHIVOS OBJETIVOS: El alumno aplicará sus conocimientos de registros y archivos con el fin de implementar una base de datos sencilla y sus funciones de altas, bajas y modificaciones. EQUIPO: Computadora Disco Flexible o algún otro medio para almacenar sus prácticas Turbo C (TC) G ENERALIDADES ARCHIVO Un archivo es una colección de registros lógicamente relacionados. Los registros son estructuras de campos ó de elementos de información relacionados de igual manera. La utilización de archivos apoya el registro de información como una colección de datos. A la colección de datos lógicamente relacionados se le conoce también como base de datos. El formato para declarar un archivo es : FILE *var_archivo; APERTURA DE UN ARCHIVO La apertura de un archivo es la creación física y lógica del mismo en el programa de aplicación. Verifica si existe o no el archivo y direcciona su posición en el lugar de almacenamiento en disco. La función de apertura y su formato es : var_archivo = fopen(nombre_en_disco_archivo,clave_de_apertura); Las posibles claves de apertura de archivos son las siguientes : CLAVE w a+ r rb+ FUNCIÓN Crear archivo nuevo Agregar datos a un archivo Apertura de solo lectura Apertura para modificacion del archivo Ejemplo : arch = fopen("archivo.dat" , "w" ); OPERACIONES CON ARCHIVOS La creación inicial de un archivo se le conoce como ALTA inicial del archivo, donde consiste en la captura y validación de datos. El acceso al archivo para consultar datos es llamado recuperación o CONSULTA de información. El cambiar de contenido en el archivo se conoce como actualización o MODIFICACION del archivo. Y al proceso de supresión o eliminación de datos se le llama BAJAS, las cuales pueden ser temporal o definitiva. La baja temporal se implementa 1 de 6 PROGRAMACIÓN laboratorio 2007-1 con un campo que almacene el estado en que se encuentra el elemento, así estarán dados de alta o de baja en el mismo archivo. La baja definitiva consiste en la eliminación total de los elementos que se quieren dar de baja. FUNCIÓN DESCRIPCIÓN Grabar un registro en archivo Leer un registro del archivo Cerrar el archivo Posicionar apuntador una una posición del archivo Obtener la posición actual del apuntador del archivo Indica la posición de final de archivo Borrar archivo de disco Renombrar archivo en disco fwrite( ... ) fread( ... ) fclose( var_archivo ) fseek( ... ) ftell( ... ) feof( var_archivo ) remove( “ nombre “ ) rename(“antes”,”nuevo” ) EJEMPLO #include #include #include #include #include <string.h> <ctype.h> <stdio.h> <conio.h> <stdlib.h> // Declaración del Registro y Archivo struct registro { char name[40]; int edad; float sueldo; int edo; } R ; FILE *arch; // Generación de un menú de opciones para la base de datos void menu() { clrscr(); gotoxy(10, 5);cprintf("[1] gotoxy(10, 6);cprintf("[2] gotoxy(10, 7);cprintf("[3] gotoxy(10, 8);cprintf("[4] gotoxy(10, 9);cprintf("[5] gotoxy(10,10);cprintf("[6] gotoxy(10,11);cprintf("[7] } Dar de alta un registro"); Imprimir informaci¢n del archivo"); Consulta por nombre"); Modificaciones"); Baja Temporal"); Baja Definitiva"); Salida "); // Lectura del Registro void leeR ( ) { char cad[40]; gotoxy(10,10); printf("Nombre: gotoxy(10,12); printf("Edad : gotoxy(10,14); printf("Sueldo: R.edo=0; } "); gotoxy(20,10); gets(R.name); "); gotoxy(20,12); gets(cad); R.edad=atoi(cad); "); gotoxy(20,14); gets(cad); R.sueldo=atof(cad); // Procedimiento de altas de datos void altas ( ) { 2 de 6 PROGRAMACIÓN laboratorio 2007-1 char tecla ; clrscr( ) ; gotoxy ( 35 , 2 ) ; cprintf ( " ALTAS " ); leeR( ); printf("\n\r Datos leidos:"); printf("\n\r %s",R.name); printf("\n\r %i",R.edad); printf("\n\r %.2f",R.sueldo); printf("\n\r "); cprintf(R.edo==0?"Alta":"Baja"); printf("\n\r Desea Grabar los Datos(s/n)?" ); tecla=toupper(getch()); if (tecla=='S') { arch=fopen("a:\\archivo.dat", "a+"); fwrite( &R, sizeof ( struct registro ), 1 , arch ); fclose(arch); cprintf("\n\r Grabado..."); getch(); } } // Procedimiento de consulta general void imprime ( ) { clrscr(); gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA GENERAL " ); cprintf("\n\r Nombre Edad Sueldo Estado \n\r " ) ; arch=fopen("a:\\archivo.dat", "r"); fread (&R,sizeof(struct registro),1,arch); while ( !feof(arch) ) { cprintf("\n\r %s de %i años ganando %.2f y dado ",R.name,R.edad,R.sueldo); cprintf(R.edo==0?"Alta":"Baja"); fread( &R, sizeof(struct registro ), 1, arch); } fclose(arch); getch(); } de // Procedimiento de busqueda por nombre int busqueda( char cad[40] ) { int pos = - 1 ; arch=fopen("a:\\archivo.dat", "r"); while ( !feof(arch) && pos==-1 ) { fread( &R, sizeof(struct registro),1,arch); if (strcmp(R.name,cad)==0) pos=ftell(arch)/sizeof(struct registro); } fclose(arch); return (pos); } // Procedimiento de consulta por nombre void consulta() { char cad[40]; int pos; clrscr(); gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA POR NOMBRE " ); gotoxy ( 5, 5 ) ; cprintf("\n Introduce nombre a buscar"); gets(cad); pos=busqueda(cad); if (pos == - 1) { gotoxy ( 5 , 10 ); printf(" No se encontro"); } 3 de 6 PROGRAMACIÓN laboratorio 2007-1 else { gotoxy ( 5, 10 ); printf("\n Se encontro a: %s %i %f dado de ", R.edad,R.sueldo ); cprintf(R.edo==0?"Alta":"Baja"); } getch(); } // Procedimiento de modificaciones R.name, void modifica() { char cad[40]; char tecla; int pos,bandera; clrscr(); gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA GENERAL " ); gotoxy ( 5, 5 ) ; cprintf(" Introduce nombre a modificar :"); gets(cad); pos=busqueda(cad); if (pos== - 1 ) { gotoxy ( 5 , 10 ); printf(" No se encontro"); getch( ); } else { do { gotoxy(10,10); cprintf("[1] Nombre = %s ", R.name); gotoxy(10,11); cprintf("[2] Edad = %i ", R.edad); gotoxy(10,12); cprintf("[3] Sueldo = %.2f ", R.sueldo); gotoxy(10,13); cprintf("[4] Estado = " ); cprintf(R.edo==0?"Alta":"Baja"); gotoxy(10,14); cprintf("[5] Terminar"); tecla=getch(); switch(tecla){ case '1' : gotoxy(23,10);clreol; gotoxy(23,10);gets(R.name); break; case '2' : gotoxy(23,11);clreol; gotoxy(23,11); gets(cad); R.edad=atoi(cad); break; case '3' : gotoxy(23,12);clreol; gotoxy(23,12); gets(cad); R.sueldo=atof(cad); break; case '4' : R.edo=R.edo==0?1:0; break; } //fin de switch } while (tecla!='5'); gotoxy(10,15);cprintf("Desea grabar modificacion(S/N)?"); tecla=toupper(getch()); if (tecla=='S'){ cprintf("Grabando..."); arch=fopen("a:\\archivo.dat", "rb+"); fseek(arch,(pos-1)*sizeof(struct registro),SEEK_SET); fwrite(&R,sizeof(struct registro),1,arch); fclose(arch); cprintf("...registro modificado."); getch( ) ; } } // fin de else de encontrarse } // Procedimiento de baja temporal void bajaT() { char cad[40]; char tecla; int pos; clrscr(); 4 de 6 PROGRAMACIÓN laboratorio 2007-1 gotoxy ( 35 , 2 ) ; cprintf ( " BAJA TEMPORAL " ); gotoxy ( 5, 5 ) ; cprintf(" Introduce nombre a dar de baja : "); gets(cad); pos=busqueda(cad); if (pos== - 1 ) { gotoxy ( 5 , 10 ); printf(" No se encontro"); } else { gotoxy(10,12); cprintf("\n Se encontro a: %s %i %f dado de ",R.name, R.edad,R.sueldo ); cprintf(R.edo==0?"Alta":"Baja"); gotoxy(10,15);cprintf("Desea darlo de baja temporal(S/N)?"); tecla=toupper(getch()); if (tecla=='S') { R.edo=1; arch=fopen("a:\\archivo.dat", "rb+"); fseek(arch,(pos-1)*sizeof(struct registro),SEEK_SET); fwrite(&R,sizeof(struct registro),1,arch); fclose(arch); cprintf("...registro dado de baja"); getch() ; } } // fin de else de encontrarse } // Procedimiento de eliminación de registro void elimina() { char tecla; char cad[40]; int pos; FILE *archaux; clrscr(); gotoxy ( 35 , 2 ) ; cprintf ( " CONSULTA GENERAL " ); gotoxy ( 5, 5 ) ; cprintf(" Introduce nombre a modificar :"); gets(cad); pos=busqueda(cad); if (pos== - 1 ) { gotoxy ( 5 , 10 ); printf(" No se encontro"); getch ( ) ; } else { gotoxy(5,10); cprintf("Encontro a %s , con %i ganando %.2f y dado de ", R.name, R.edad, R.sueldo ); cprintf(R.edo==0?"Alta":"Baja"); gotoxy(5,14);cprintf("Desea eliminarlo(S/N)?"); tecla=toupper(getch()); if (tecla=='S') { cprintf("Eliminando..."); archaux = fopen("a:\\auxilio.dat","w"); arch = fopen("a:\\archivo.dat","r"); fread(&R,sizeof(struct registro),1,arch); while ( !feof(arch) ) { if (strcmp(R.name,cad)!=0) fwrite(&R,sizeof(struct registro),1,archaux); fread(&R,sizeof(struct registro),1,arch); } fclose(arch); fclose(archaux); remove("a:\\archivo.dat"); rename("a:\\auxiliar.dat", "a:\\archivo.dat"); cprintf("... registro eliminado"); getch(); } // fin tecla Si } // fin else } // Programa principal void main() { 5 de 6 PROGRAMACIÓN laboratorio 2007-1 char opc; do { menu(); opc=toupper(getch()); switch(opc) { case '1' : altas(); break; case '2' : imprime(); break; case '3' : consulta(); break; case '4' : modifica(); break; case '5' : bajaT(); break; case '6' : elimina(); break; } } while (opc!=27 && opc!='7'); } ACTIVIDAD Modificar el código del ejemplo para almacenar la información de los libros en una biblioteca: a). Titulo b). Autor c). Edición d). Editorial e). ISBN f). Numero de ejemplares 6 de 6