/ OBJETIVOS Explicar el manejo de archivos de texto. Explicar el manejo de archivos binarios. Desarrollar programas que usen archivos. LABORATORIO 6 MANEJO DE ARCHIVOS DE TEXTO Y BINARIOS Msc. Walter Fernandez Toglio. 1
/ TEMAS Archivos de texto. Archivos binarios. SOFTWARE NECESARIO Dev-C++ 4.9.9.2 http://sourceforge.net/projects/dev-cpp/files/binaries/ NetBeans IDE C/C++ http://netbeans.org/features/cpp/ Code::Blocks http://www.codeblocks.org/downloads/26 Eclipse C++ http://www.eclipse.org/downloads/packages/eclipse-ide-ccdevelopers-includes-incubating-components/indigosr1 Visual C++ http://www.microsoft.com/visualstudio/eng/products/visual-studioexpress-products Borland C++ http://edn.embarcadero.com/article/20633 Msc. Walter Fernandez Toglio. 2
/ MARCO TEÓRICO Documentación y ejercicios del documento de teoría. Msc. Walter Fernandez Toglio. 3
/ ACTIVIDADES Analizar y explicar el funcionamiento de.cada uno de los ejemplos. EJEMPLO 1 Implementar programa que permita leer y buscar en un archivo de texto SOLUCIÓN /* lee y busca */ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct char nombre[50]; float precio; TDAT; int Buscar(char nom[], TDAT *pplato); int main(void) char nom[50]; TDAT pl_bus; int enc; printf("plato a buscar: "); scanf(" %[^\n]",nom); enc =0; enc = Buscar(nom, &pl_bus); if (enc==1) printf("\n%s",pl_bus.nombre); printf("\n%f",pl_bus.precio); else printf("\nplato no encontrado"); int Buscar(char nom[], TDAT *pplato) FILE *pf; int encontrado; int n; int lg; char *r; pf = fopen("datos.txt", "r"); if (pf==null) Msc. Walter Fernandez Toglio. 4
/ printf("\nerror en la apertura"); encontrado = 0; r = fgets(pplato->nombre,50,pf); while(r!=null && encontrado==0) lg = strlen(pplato->nombre); pplato->nombre[lg-1]= '\0'; n = fscanf(pf,"%f\n", &pplato->precio); if (strcmp(pplato->nombre,nom)==0) encontrado = 1; else r = fgets(pplato->nombre,50,pf); if(fclose(pf)!=0) printf("\nerror en el cierre"); return encontrado; Msc. Walter Fernandez Toglio. 5
/ EJEMPLO 2 Lectura de estructuras en archivos de binarios SOLUCIÓN #include <stdio.h> #include <stdlib.h> #include <string.h> typedef char T_Cadena30[30]; typedef struct char nombre[30]; int edad; T_Ficha; typedef T_Ficha T_Lista[10]; void introducir_datos(t_lista lista); void pinta_datos(t_lista lista); void guardar_fichero(t_lista lista); void cargar_fichero(t_lista lista); void modificar(void); int main(void) T_Lista lista,lista2; introducir_datos(lista); guardar_fichero(lista); modificar(); cargar_fichero(lista2); pinta_datos(lista2); system("pause"); return 0; void introducir_datos(t_lista lista) int cont; printf("introduzca los nombres y edades de 5 personas: \n"); for (cont=0;cont<5;cont++) fflush(stdin); printf("introduzca el nombre de la persona:\n"); gets(lista[cont].nombre); printf("introduzca la edad de la persona:\n"); scanf("%d",&lista[cont].edad); void pinta_datos(t_lista lista) int cont; printf("\n:::::los datos del fichero leido son:\n"); for (cont=0;cont<5;cont++) printf("nombre: "); puts(lista[cont].nombre); printf("edad: "); Msc. Walter Fernandez Toglio. 6
/ printf("%d\n",lista[cont].edad); void guardar_fichero(t_lista lista) FILE *punt; int cont; printf("\nguardando FICHERO...\n"); punt=fopen("c:\\tmp\\datos.dat","wb"); if (punt==null) printf("\nerror"); for(cont=0;cont<5;cont++) fwrite(&lista[cont],sizeof(t_ficha),1,punt); /* Otra opción en vez del bucle anterior fwrite(lista,sizeof(t_ficha),5,punt); */ if (fclose(punt)!= 0) printf("error al cerrar el archivo"); printf("\n:::::fichero GUARDADO:::::\n"); void cargar_fichero(t_lista lista) FILE *punt; int cont=0; printf("\nleyendo FICHERO...\n"); punt=fopen("c:\\tmp\\datos.dat","rb"); if (punt==null) printf("\n Error al abrir el fichero"); while ( fread(&lista[cont],sizeof(t_ficha),1,punt) == 1) cont++; if (fclose(punt)!= 0) printf("error cerrando el fichero "); printf("\n:::::fichero LEIDO:::::\n"); void modificar(void) FILE *punt; T_Ficha registro; int cont=0; T_Cadena30 cadena; fflush(stdin); printf("\nintroduzca nombre a buscar:\n"); Msc. Walter Fernandez Toglio. 7
/ gets(cadena); printf("\nleyendo FICHERO Y BUSCANDO NOMBRE SOLICITADO...\n"); punt=fopen("c:\\tmp\\datos.dat","rb+"); if (punt==null) printf("\nerror"); do fread(®istro,sizeof(t_ficha),1,punt); cont++; while ((strcmp(registro.nombre,cadena)!=0)&&(cont<5)); if (strcmp(registro.nombre,cadena)==0) printf("\n...individuo ENCONTRADO...\n"); printf("\n...datos ACTUALES:\n"); printf("nombre: %s\n",registro.nombre); printf("edad: %d\n",registro.edad); printf("\n:::::introduzca NUEVOS DATOS:::::::::\n"); fflush(stdin); printf("introduzca el nombre de la persona:\n"); gets(registro.nombre); printf("introduzca la edad de la persona:\n"); scanf("%d",®istro.edad); printf("\n...modificando LOS DATOS EN EL FICHERO...\n"); fseek(punt,(cont-1)*sizeof(t_ficha),seek_set); fwrite(®istro,sizeof(t_ficha),1,punt); printf("\n...datos MODIFICADOS EN EL FICHERO...\n"); else printf("\n::::el NOMBRE SOLICITADO NO SE ENCUENTRA EN EL FICHERO::::\n"); if (fclose(punt)!= 0) printf("\n:::::fichero GUARDADO:::::\n"); Msc. Walter Fernandez Toglio. 8
/ Msc. Walter Fernandez Toglio. 9
/ EJERCICIOS 1 Escribir un programa que cree un archivo BINARIO que contenga los siguientes datos: Nombre. Dirección. Número de telefono. Edad. El programa debe permitir: Leer registros. Escribir registros. Buscar registros. 2 Almacenar el alfabeto en un archivo BINARIO, a continucación leer dos letras(por ejemplo las posiciones 9 y 17) de ese archivo y cambiar esas letras por una z 3 En un instituto de investigación se ha realizado el registro de los datos relacionados con una gran cantidad de experimentos para determinar los efectos de una droga. Estos datos se han almacenado en un único archivo BINARIO con el siguiente formato: A. Una cabecera con los datos básicos del voluntario: Número de historia clínica: entero de 32 bits sin signo Nombre: cadena de 50 caracteres Apellido: cadena de 50 caracteres Edad: entero de 8 bits Sexo: caracter (M o F) Fecha de ingreso: cadena de 8 caracteres (aaaammdd) B. Temperaturas en cada día del tratamiento: Cantidad de mediciones: entero de 32 bits sin signo Mediciones: flotantes de 32 bits C. Presión arterial máxima en cada día del tratamiento: Cantidad de mediciones: entero de 32 bits sin signo Mediciones: flotantes de 32 bits. Se requiere la implementación de métodos independientes para: a) Listar los apellidos de todos los voluntarios b) Calcular la edad promedio de los voluntarios c) Listar las temperaturas o presiones de un voluntario a solicitud del investigador d) Encontrar al voluntario que tuvo la presión más alta. Msc. Walter Fernandez Toglio. 10
/ 4 En el procesamiento de datos comerciales es común tener varios archivos en cada sistema de aplicación. Por ejemplo, en un sistema de cuentas por cobrar hay generalmente un sistema de archivo maestro que contiene información detallada acerca de cada cliente, tal como el nombre, dirección, número telefónico, saldo pendiente, límite de crédito, condiciones de descuento, acuerdos contractuales y, posiblemente, una historia condensada de las compras recientes y sus pagos realizados. Conforme suceden transacciones (es decir, se hacen ventas y llegan por correo los pagos en efectivo), éstas se introducen en un archivo. Al final de cada periodo de negocios se aplica el archivo de transacciones (llamado trans.dat) al archivo maestro (llamado oldmast.dat) y, por lo tanto, se actualiza el registro de compras y pagos de cada cuenta. Durante una ejecución de actualización se vuelve a escribir el archivo maestro como un nuevo archivo (newmast.dat), el cual luego se utiliza al final del siguiente periodo de negocios para iniciar nuevamente el proceso de actualización. Los programas de concordancia de archivo deben manejar determinados problemas que no existen en los programas de un solo archivo. Por ejemplo, no siempre sucede una concordancia. Puede ser que un cliente que esté en el archivo maestro no haya hecho ninguna compra o pago en efectivo en el periodo actual del negocio y, por lo tanto, no aparecerá ningún registro para este cliente en un archivo de transacciones. En forma similar, un cliente que hizo alguna compra o pago en efectivo puede haberse cambiado a esta comunidad, y puede ser que la compañía todavía no haya tenido oportunidad de crear un registro maestro para este cliente. Escriba un programa completo de concordancia de archivo de cuentas por cobrar. Utilice el número de cuenta de cada archivo como clave de registro para efectos de concordancia. Suponga que cada archivo es un archivo secuencial con los registros almacenados en orden ascendente por número de cuenta. Cuando suceda una concordancia (es decir, cuando aparezcan registros con el mismo número de cuenta en el archivo maestro y en el archivo de transacciones) súmele el importe en pesos que está en el archivo de transacciones al saldo actual, que está en el archivo maestro, y escriba el registro del newmast.dat. (Suponga que las compras están indicadas por cantidades positivas en el archivo de transacciones y que los pagos están indicados por cantidades negativas). Cuando hay un registro maestro para una cuenta particular, pero no hay registro de transacciones correspondiente, escriba simplemente el registro maestro a newmast.dat. Cuando haya un registro de transacción, pero no hay registro maestro correspondiente, imprima el mensaje registro de transacción no concuerda con uno maestro (llene el número de cuenta a partir del registro de transacciones) Msc. Walter Fernandez Toglio. 11
/ 5 Después de escribir el programa del problema anterior escriba un programa simple para crear algunos datos de prueba para la revisión del programa. Utilice los siguientes datos de cuentas como ejemplo: EN ARCHIVO MAESTRO NÚMERO DE CUENTA NOMBRE SALDO 100 Juan Pérez 348.17 300 María Candelaria 27.19 500 Samuel Hernández 0.00 700 Susana Dosamantes -14.22 EN ARCHIVO DE TRANSACCIONES NÚMERO DE CUENTA CANTIDAD DE LA TRANSACCIÓN 100 27.14 300 62.11 400 100.56 900 82.17 Ejecute el programa del problema utilizando estos archivos de datos de prueba y muestre el nuevo archivo maestro. Revise que las cuentas se hayan actualizado correctamente. 6 Es posible (y de hecho es común) tener varios registros de transacciones que tengan la misma clave de registro. Esto sucede debido a que un cliente particular puede hacer varias compras y pagos en efectivo durante un periodo del negocio. Vuelva a escribir el programa de concordancia de archivos de cuentas por cobrar para tomar en cuenta la posibilidad de manejar varios registros de transacciones que tengan la misma clave de registro. Modifique los datos de prueba para incluir los registros de transacciones adicionales siguientes: EN ARCHIVO DE TRANSACCIONES NÚMERO DE CUENTA CANTIDAD DE LA TRANSACCIÓN 300 83.79 700 80.78 700 1.53 Msc. Walter Fernandez Toglio. 12
/ 7 Suponga que se ha definido la estructura: struct persona char apellido[15]; char nombre[15]; char edad[2]; ; Escriba un programa para: A. Inicializar archivo nombreedad.dat con 100 registros que contengan apellido = no asignado, nombre = y edad = 0. B. Agregar 10 apellidos, nombres y edades. C. Actualizar un registro a pedido del usuario y si el registro está vacío muestre un mensaje Registro sin información!. D. Borrar la información de un registro volviendo a inicializar sus campos. 8 Usted ha sido empleado en un hospital y necesita llevar un inventario que pueda decirle qué materiales descartables se pueden tener disponibles, cuandos hay en existencia y el costo de cada uno. Escriba un programa que: E. Inicialice el archivo de acceso aleatorio descartables.dat con 100 registros vacíos F. Permita que se introduzcan los datos relacionados con cada material G. Liste todos los materiales H. Se borre un registro para un material que ya no se utilice I. Actualice cualquier información que haya en el archivo. El número de identificación de cada material descartable deberá ser el número de registro. Msc. Walter Fernandez Toglio. 13