1 Archivos Programación
2 Introducción El manejo de archivos no está ínter construido en CSe provee en la biblioteca stdio.h con funciones que inician con "f" Las funciones trabajan igual que las de entrada y salida estándar Los archivos se representan como secuencias de caracteres Es fácil moverse hacia adelante para leer o escribir caracteres, pero es casi imposible moverse hacia atrás
3 Flujos Antes de leer o escribir se debe asociar un flujo (stream) a los archivos El flujo es una apuntador a una estructura Todo programa en C abre tres flujos: stdin, stdout, stderr stdin: entrada estándar esta relacionada con el teclado stdout: salida estándar esta relacionada con la pantalla stderr: salida estándar de errores esta relacionada con la pantalla
4 Que es un Flujo? Un flujo crea una región de memoria (buffer) entre el programa y el archivo en disco Esto reduce los accesos a disco Los caracteres se leen en bloques en el buffer, o se escriben en bloques en el disco Flujo de salida a b c d e f a b c d e f Flujo de entrada
5 Porque stdout y stderr? Por la redirección soportada en Unix, DOS, OS/2, etc. #include
6 stdin está basado en líneaslos caracteres tecleados son retenidos (buffered) hasta presionar ENTER #include
7 Operaciones básicas con archivosAbrir archivo - fopen(archivo) Leer de o escribir en archivo fscanf(archivo,formato,lista) - lee diferentes variables fgetc(archivo) - lee un carácter fgets(cadena,tamaño,archivo) - lee una cadena fprintf(archivo,formato,lista) - escribe diferentes variables fputc(archivo) - escribe un carácter fputs(cadena,archivo) - escribe una cadena Cerrar archivo - fclose(archivo)
8 Lectura de un archivo #include
9 Ejemplos El siguiente programa lee caracteres desde el teclado y los escribe en un archivo carácter por carácter hasta que el usuario teclea ENTER: #include
10 Lee un archivo hasta el final y lo despliega en pantalla#include
11 Lee cadenas desde el teclado y las escribe en un archivo usando fputs:#include
12 Lee cadenas de 30 caracteres desde un archivo usando fgets y las despliega en pantalla.#include
13 Escritura de datos numéricos con fprintf#include
14 Lectura de datos numéricos#include
15 Escritura de datos numéricos con fprintf#include
16 Lectura de datos numéricos#include
17 Quiz Escriba un programa que escriba en un archivo de nombre “datos.txt” su nombre, direccion, telefono y la carrera que está cursando. Cada elemento escríbalo en una línea distinta. Abrir archivo - fopen(archivo,modo) Leer de o escribir en archivo fscanf(archivo,formato,lista) - lee diferentes variables fgetc(archivo) - lee un carácter fgets(cadena,tamaño,archivo) - lee una cadena fprintf(archivo,formato,lista) - escribe diferentes variables fputc(archivo) - escribe un carácter fputs(cadena,archivo) - escribe una cadena Cerrar archivo - fclose(archivo)
18 Ejemplo de calificaciones#include
19 #include
20 Leer datos de los clientes de un banco.void leerClientes(FILE *archivo){ int cuenta; char nombre[30]; float saldo; while(!feof(archivo)){ fscanf(archivo,"%d\n",&cuenta); fscanf(archivo,"%s\n",nombre); fscanf(archivo,"%f\n",&saldo); printf("%d, %s, saldo = %.2f\n",cuenta,nombre,saldo); } fclose(archivo); main(){ FILE *archivo; if((archivo = fopen("cuentas.txt","r"))!=NULL) leerClientes(archivo); else printf("No se pudo leer el archivo."); getch();
21 Actividad 1. Escriba una función que despliegue todos los clientes de un banco que tienen saldos negativos. 2. Escriba una función que despliegue todos los clientes de un banco que tienen saldos entre 1,000 y 1,000,000. 3. Escriba una función que despliegue todos los clientes de un banco que escriba en otro archivo los datos de los clientes que tienen saldos negativos.
22 Escritura al final de archivosAl abrir un archivo con fopen se pueden especificar los siguientes modos: “r” – abrir para solo lectura. El archivo debe existir. “w” – abrir solo para escritura si existe el archivo, se borra. “a” – abrir para agregar nuevos datos al final. “r+” – abrir para realizar modificaciones, es decir, leer o escribir. El archivo debe existir. “w+” – abrir para leer y escribir. Si el archivo existe lo borra. “a+” – abrir para leer e incorporar nuevos datos al final. Si el archivo no existe, lo crea.
23 ejemplo #include
24 Un ejemplo con menú La internase de menú permite controlar adecuadamente programas basados en consola. Un menú ofrece una serie de opciones para seleccionar al usuario. El usuario elige una opción y el programa responde ejecutando la función de la opción seleccionada. Menú: 1. Opción uno 2. Opción dos N. salir
25 Desplegar menú void clear(){ int i; for(i=0;i<25;i++) printf("\n");} void despliegaMenu(){ clear(); printf("1. Capturar temperaturas\n\n"); printf("2. Ver temperaturas\n\n"); printf("3. Estadisticas\n\n"); printf("4. Terminar\n\n"); printf("Opcion: ");
26 leerTemperaturas void leerTemperaturas(){ int dia,mes,anyo;float tMax,tMin; FILE *archivo; clear(); printf("Introduzca fecha (dd mm aa): "); scanf("%d %d %d",&dia,&mes,&anyo); printf("Introduzca temperatura maxima: "); scanf("%f",&tMax); printf("Introduzca temperatura minima: "); scanf("%f",&tMin); archivo = fopen("temps.txt","a+"); fprintf(archivo,"%d %d %d %.2f %.2f\n", dia,mes,anyo,tMax,tMin); fclose(archivo); }º
27 verTemperaturas void verTemperaturas(){ int dia,mes,anyo,lineas=0;float tMax,tMin; FILE *archivo; archivo = fopen("temps.txt","r"); clear(); do{ fscanf(archivo,"%d %d %d %f %f\n",&dia,&mes,&anyo,&tMax,&tMin); if(tMax<60) printf("Fecha %2d/%2d/%4d: Temp. max %.2f, Temp. min %.2f\n", dia,mes,anyo,tMax,tMin); if(lineas==20){ lineas = 0; printf("Presione una tecla..."); getch(); } else lineas++; }while(!feof(archivo)); fclose(archivo);
28 estadisticas void estadisticas(){ int dia,mes,anyo,lineas=0;float tMax,tMin,maxima=-100,minima=100,promedio = 0; FILE *archivo; archivo = fopen("temps.txt","r"); clear(); do{ fscanf(archivo,"%d %d %d %f %f\n", &dia,&mes,&anyo,&tMax,&tMin); if(tMax<60){ if(tMax>maxima) maxima = tMax; if(tMin
29 El menú void menu(){ char ch; do{ despliegaMenu(); ch = getchar();switch(ch){ case '1':leerTemperaturas();break; case '2':verTemperaturas();break; case '3':estadisticas();break; } }while(ch!='4');
30 Inicio y función main void inicia(){ FILE *archivo;archivo = fopen("temps.txt","r"); if(archivo==NULL){ archivo = fopen("temps.txt","w"); fclose(archivo); } main(){ inicia(); menu();
31 Archivos de tipo aleatorioLos archivos de tipo texto solo pueden actualizarse reescribiendo todas las líneas de texto. Los archivos de acceso aleatorio permiten escribir registros arbitrarios sin necesidad de reescribirlo por completo. Los registros en los archivos aleatorios son todos del mismo tamaño. Se utiliza las siguietes funciones fwrite(arreglo, tamaño, #de registros, archivo)- escribe un arreglo de registros en un archivo. fread(arreglo, tamaño, #de registros, archivo)- lee un arreglo de registros de un archivo.
32 Ejemplo struct alumno{ int matricula; char nombre[20]; int carrera;float promedio; }; main(){ FILE *archivo; if((archivo=fopen("alu.dat","w"))!=NULL) escribeArchivo(archivo); else printf("\nel archivo no se puede crea..."); fclose(archivo); }
33 void escribeArchivo(FILE *archivo){alumno alu; int i=0,r; printf("Deseas ingresar informacion sobre alumnos? (Si=1, No=0): "); scanf("%d",&r); while(r){ i++; printf("Matricula: "); scanf("%d",&alu.matricula); fflush(stdin); printf("Nombre: "); gets(alu.nombre); printf("Carrera: "); scanf("%d",&alu.carrera); printf("Promedio: "); scanf("%f",&alu.promedio); //escribe en el archivo fwrite(&alu,sizeof(alumno),1,archivo); printf("Deseas ingresar informacion sobre mas alumnos? (Si=1, No=0): "); }
34 Leer archivo de datos void leerArchivo(FILE *archivo){ alumno alu;fread(&alu,sizeof(alumno),1,archivo); while(!feof(archivo)){ printf("Matricula: %d\n",alu.matricula); printf("Nombre: "); puts(alu.nombre); printf("Carrera: %d\n",alu.carrera); printf("Promedio: %.2f\n",alu.promedio); } main(){ FILE *archivo; if((archivo=fopen("alu.dat","r"))!=NULL) leerArchivo(archivo); else printf("\nel archivo no se puede leer..."); fclose(archivo); getch();
35 Ejemplo con menú void despliegaAlumno(alumno alu){printf("\nMatricula: %d\n",alu.matricula); printf("Nombre: "); puts(alu.nombre); printf("Carrera: %d\n",alu.carrera); printf("Promedio: %.2f\n",alu.promedio); } long int filesize(FILE *archivo){ long int size_of_file; fseek(archivo,0L,SEEK_END); size_of_file = ftell(archivo); fseek(archivo,0L,SEEK_SET); return size_of_file;
36 void explorarArchivo(FILE *archivo){alumno alu; char ch; int registro=0,maxRegistros; //obtiene el # de registros maxRegistros = filesize(archivo)/sizeof(alumno); fread(&alu,sizeof(alumno),1,archivo); despliegaAlumno(alu); printf("\nregistro #%d, s - siguiente, a - anterior, q - salir: ",registro); do{ ch = getch(); if(ch == 'a'&®istro>0){ registro--; fseek(archivo,registro*sizeof(alumno),0); } if((ch == 's')&& registro