Vous êtes sur la page 1sur 32

Archivos o Ficheros

Introduccin
Se provee en la biblioteca stdio.h con funciones que inician con "f" Las funciones trabajan igual que las de entrada y salida estndar Los archivos se representan como secuencias de caracteres

Operaciones bsicas con archivos


1. Abrir archivo fopen(archivo,modo)

2. Leer de o escribir en archivo


fscanf(archivo,formato,lista) - lee diferentes variables fgetc(archivo) - lee un carcter fgets(cadena,tamao,archivo) - lee una cadena fprintf(archivo,formato,lista) - escribe diferentes variables fputc(archivo) - escribe un carcter fputs(cadena,archivo) - escribe una cadena 3. Cerrar archivo - fclose(archivo)

Escritura al final de archivos


Al 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.

Lectura de un archivo
#include <stdio.h> int main(){ char nombre[80]; FILE *entrada; int ch; printf("Archivo: "); scanf("%79s",nombre); if((entrada=fopen(nombre,"r"))==NULL){ fprintf(stderr,"fallo la lectura de %s",entrada); perror("debido a"); getch(); return 1; } while((ch=fgetc(entrada))!= EOF) putchar(ch); fclose(entrada); getch(); return 0; }

Ejemplos
El siguiente programa lee caracteres desde el teclado y los escribe en un archivo carcter por carcter hasta que el usuario teclea ENTER: #include <stdio.h> main(){ char p; FILE *archivo; archivo = fopen("test1.txt","w"); if(archivo!=NULL){ while((p=getchar())!='\n') fputc(p,archivo); fclose(archivo); } else printf("No se puede crear el archivo..."); getch(); }

Lee un archivo hasta el final y lo despliega en pantalla


#include <stdio.h> main(){ char p; FILE *archivo; archivo = fopen("test1.txt","r"); if(archivo!=NULL){ while(!feof(archivo)){ p = fgetc(archivo); putchar(p); } fclose(archivo); } else printf("No se puede abrir el archivo..."); getch(); }

Lee cadenas desde el teclado y las escribe en un archivo usando fputs: #include <stdio.h>

main(){ char cadena[30]; FILE *archivo; archivo = fopen("test2.txt","w"); if(archivo!=NULL){ do{ printf("Escriba una cadena: "); gets(cadena); if(cadena[0]!='\0') fputs(cadena,archivo); }while(cadena[0]!='\0'); fclose(archivo); } else printf("No se puede crear el archivo..."); getch(); }

Lee cadenas de 30 caracteres desde un archivo usando fgets y las despliega en pantalla. #include <stdio.h>
main(){ char cadena[30]; FILE *archivo; archivo = fopen("test2.txt","r"); if(archivo!=NULL){ while(!feof(archivo)){ fgets(cadena,30,archivo); puts(cadena); } fclose(archivo); } else printf("No se puede leer el archivo..."); getch(); }

Escritura de datos numricos con fprintf


#include <stdio.h> main(){ int i; FILE *archivo; archivo = fopen("test4.txt","w"); if(archivo!=NULL){ for(i = 0; i< 10; i++) fprintf(archivo,"%d %d\n",i,i*i); fclose(archivo); } else printf("No se puede crear el archivo..."); getch(); }

Lectura de datos numricos #include <stdio.h>


main(){ int i,j; FILE *archivo; archivo = fopen("test4.txt","r"); if(archivo!=NULL){ for(i = 0; i< 10; i++){ fscanf(archivo,"%d %d\n",&i,&j); printf("%d %d\n",i,j); } fclose(archivo); } else printf("No se puede crear el archivo..."); getch(); }

Escribe las calificaciones de un grupo de alumnos


#include <stdio.h> void escribeCalificaciones(FILE *archivo){ int i,j,n,matricula; float calificacion; printf("Ingrese numero de alumnos: "); scanf("%d",&n); fprintf(archivo,"%d",n); for(i=0;i<n;i++){ printf("Ingrese la matricula del alumno: "); scanf("%d",&matricula); fprintf(archivo,"\n%d ",matricula); for(j=0;j<5;j++){ printf("Ingrese la calificacion %d: ",j); scanf("%f",&calificacion); fprintf(archivo,"%.2f ",calificacion); } } fclose(archivo); }

main(){ FILE *archivo; if((archivo = fopen( "datosAlumnos.txt", "w"))!=NULL) escribeCalificaciones(archivo); else printf("No se pudo crear el archivo."); }

Lee las calificaciones de un grupo de alumnos y calcula el promedio final. #include <stdio.h> void leerCalificaciones(FILE *archivo){ int i,j,n,matricula; float calificacion,suma; fscanf(archivo,"%d",&n); printf("Numero de alumnos: %d\n",n); printf("clave \t1\t2\t3\t4\t5\tprom.\n"); for(i=0;i<n;i++){ fscanf(archivo,"%d",&matricula); printf("%d",matricula); suma = 0; for(j=0;j<5;j++){ fscanf(archivo,"%f",&calificacion); printf("\t%.2f ",calificacion); suma += calificacion; } printf("\t%.2f\n",suma/5.0); } fclose(archivo); }

main(){ FILE *archivo; if((archivo = fopen( "datosAlumnos.txt","r"))!=NULL) leerCalificaciones(archivo); else printf("No se pudo leer el archivo."); getch(); }

Leer datos de los clientes de un banco.


#include<stdio.h> 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(); }

ejemplo
#include <stdio.h> main(){ FILE *archivo; archivo = fopen("testApend.txt","w"); fprintf(archivo,"Esta es una prueba de append\n"); fclose(archivo); archivo = fopen("testApend.txt","a"); fprintf(archivo,"Esta linea se agrego despues.\n"); fclose(archivo); archivo = fopen("testApend.txt","a+"); while(!feof(archivo)) putchar(fgetc(archivo)); getch(); fprintf(archivo,"Esta linea se agrego al final.\n"); fclose(archivo); }

Un ejemplo con men


La interfase de men permite controlar adecuadamente programas basados en consola.
Un men ofrece una serie de opciones para seleccionar al usuario. El usuario elige una opcin y el programa responde ejecutando la funcin de la opcin seleccionada.

Men:

1. Opcin uno

2. Opcin dos

N. salir

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: "); }

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); }

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(); clear(); } else lineas++; }while(!feof(archivo)); printf("Presione una tecla..."); getch(); fclose(archivo); }

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<minima) minima = tMin; promedio += tMax+tMin; } lineas++; }while(!feof(archivo)); printf("Temp. max: %.2f\nTemp. min: %.2f\n" "Promedio: %.2f\n\n\n",maxima,minima,promedio/lineas); printf("Presione una tecla..."); getch(); fclose(archivo); }

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'); }

Inicio y funcin main


void inicia(){ FILE *archivo; archivo = fopen("temps.txt","r"); if(archivo==NULL){ archivo = fopen("temps.txt","w"); fclose(archivo); } }
main(){ inicia(); menu(); }

Archivos Binarios
Se utiliza las siguietes funciones fwrite(arreglo, tamao, #de registros, archivo)- escribe un arreglo de registros en un archivo. fread(arreglo, tamao, #de registros, archivo)- lee un arreglo de registros de un archivo. Parmetros

wb : escribir
rb: leer

ab: aadir

include<stdio.h> main(){ FILE * fp; int i; //crear y escribir en un archivo de texto fp = fopen("binario1.dat", "wb"); for(i=97;i<123;i++) fwrite(&i,sizeof(int),1,fp); fclose(fp); //leer de un archivo de texto fp = fopen("binario1.dat", "rb"); do{ fread(&i,sizeof(int),1,fp); printf("%d\n",i); }while(!feof(fp)); fclose(fp); system("pause"); }

Usando estructuras
#include<stdio.h> typedef struct alumno{ int matricula; char nombre[20]; int carrera; float promedio; }alumno;

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): "); scanf("%d",&r); } }

main(){ FILE *archivo; if((archivo=fopen("alu.dat","w"))!=NULL) escribeArchivo(archivo); else printf("\nel archivo no se puede crea..."); fclose(archivo); }

Leer archivo de datos


#include<stdio.h> typedef struct alumno{ int matricula; char nombre[20]; int carrera; float promedio; }alumno;

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); fread(&alu,sizeof(alumno),1,archivo); } } main(){ FILE *archivo; if((archivo=fopen("alu.dat","r"))!=NULL) leerArchivo(archivo); else printf("\nel archivo no se puede leer..."); fclose(archivo); getch(); }

Ejercicios
1. Escriba una funcin que despliegue todos los clientes de un banco que tienen saldos negativos. 2. Escriba una funcin que despliegue todos los clientes de un banco que tienen saldos entre 1,000 y 1,000,000.

3. Escriba una funcin que despliegue todos los clientes de un banco que escriba en otro archivo los datos de los clientes que tienen saldos negativos.