Tem a 8 : Ficheros en C.
Transcripción
Tem a 8 : Ficheros en C.
Tem a 8 :Ficheros en C . Ö 8.1 Introducción Ö 8.2 Ficheros de texto de acceso secuencial – 8.2.1 D eclaración de Ficheros – 8.2.2 Apertura de ficheros – 8.2.3 Lectura/escritura en ficheros – 8.2.4 C errarun fichero – 8.2.5 Ficheros estándar – 8.2.6 Errores en tratam iento de ficheros Ö 8.3 Ejem plos Tem a 8:Ficheros en C Fundam entos de Program ación 1 8.1.Introducción. Los Ficheros son una estructura de datos que perm iten alm acenarde form a perm anente los datos en un dispositivo de alm acenam iento m asivo. Los ficheros dependen delsistem a operativo,desde elpunto de vista del program adorsólo se controla su contenido,los datos. Según su contenido se distinguen dos tipos: D e Texto:D atos en form a de caracteres Binarios: D atos en binario (bytes)organizados en bloques,no sufren ninguna conversión. Eltrabajarcon un tipo u otro im plica em pleardiferentes funciones de m anejo Según eltipo de acceso se tienen: Secuencial directo Eltem a se centrará en elestudio de los ficheros de acceso secuencial,que son los m ás com unes y utilizados Tem a 8:Ficheros en C Fundam entos de Program ación 2 8.2.Ficheros de texto de acceso secuencial. La utilización de ficheros im plica la realización de las siguientes tareas con elsiguiente orden lógico: 1.-D eclaración de variables de tipo fichero y reserva de m em oria 2.-C rearo abrirun fichero 3.-Leero escribirdatos 4.-C errarfichero Tem a 8:Ficheros en C Fundam entos de Program ación 3 8.2.1.D eclaración de ficheros. Antes de trabajarcon ficheros hay que declararlos,un puntero a fichero,a los que se les asignará un archivo de disco que servirá para identificarlos: #include <stdio.h> FILE *variableFichero; p.e.: FILE *f; Es decir,se ha declarado una variable fcom o puntero a fichero.Esta declaración equivale a la asignación delárea de buferdelfichero. Tem a 8:Ficheros en C Fundam entos de Program ación 4 8.2.2.A pertura de ficheros. U na vez declarado elfichero hay que asignarle elarchivo con elque se va trabajar: variableFichero = (“nom breFicheroD O S”,“m odoApertura”); f= open(“C :\TR ABAJO \D ATO S.D AT”,”r+”); Este puntero identificará alfichero correspondiente en nuestra aplicación.El valorde este puntero no se debe m odificar.Sihubiera erroren la apertura se devolvería elvalorN U LL M O D O S D E A PER TU R A r Lectura w Escritura.Sino existe lo crea r+ Lectura/escritura w+ Lectura/escritura.Sino existe lo crea.Siexiste lo borra a Añadiralfinal.Sino existe lo crea a+ Lectura/añadiralfinal.Sino existe lo crea Tem a 8:Ficheros en C Fundam entos de Program ación 5 8.2.3.Lectura/escritura en ficheros. U na vez listo elfichero y conform e alm odo establecido se tienen unas funciones para escribir/leerdatos de un fichero.Estas son sem ejantes a las ya conocidas de entrada/salida estándar: ESC R IBIR un carácter: fputc(expresión,variableFichero); con form ato: fprintf(variableFichero,form ato,lista variables); LEER un carácter: fgetc(variableFichero); con form ato: fscanf(variableFichero,form ato,lista variables); FILE *f,*g; charc; intx; f=open(“LISTA1.D AT”,”w ”); /*se crea elarchivo */ g=fopen(“LISTA2.D AT”,”r+”); /*se puede leery escribir*/ fputc(c,f); fscanf(g,”% c% 4d”,&c,&x); fprintf(f,”% 4d”,x); c=fgetc(g); Tem a 8:Ficheros en C Fundam entos de Program ación 6 8.2.3.Lectura/escritura en ficheros.C ont. En los ficheros alm acenados en disco se tendrá siem pre una m arca de final de fichero,indicativa de la no existencia de m ás datos en elm ism o.Esta m arca es EO F y se deberá com probar,sobretodo en las sucesivas lecturas,sise ha alcanzado dicha m arca.Para ello se dispone de una función específica que devuelve kC IER TO (fin fichero)o kFALSO : intfeof(variableFichero); Ejem plo: #include <stdio.h> FILE *f; f=fopen(“texto.txt”,”r”); w hile(!feof(f))putchar(fgetc(f)); N ota:alescribiren un fichero elfinalde línea (EO LN )-> fputc(‘\n’,f);lo que equivale en D O S a C R (13)y LF (10).Esto lo convierte autom áticam ente elcom pilador.Pero a la hora de efectuaruna lectura se habrá de teneren cuenta esta consideración (C R + LF). Tem a 8:Ficheros en C Fundam entos de Program ación 7 8.2.4.C errar un Fichero Tras realizarlas distintas operaciones de m anipulación de un fichero,lo que hay que haceres cerrarelfichero com o garantía de que los datos se alm acenarán correctam ente en eldispositivo correspondiente. intfclose(variableFichero); -> fclose(f); La finalización delprogram a cierra todos los ficheros abiertos,pero no es aconsejable nide buen program adordejaresta laboralcom pilador. Se debe cerrarun fichero antes de abrirlo de nuevo en caso de querer establecerun nuevo m odo de apertura,o en caso de volvera leerdatos delm ism o ya que sino podríam os encontrarnos en la m arca EO F. Tem a 8:Ficheros en C Fundam entos de Program ación 8 8.2.5.Ficheros Estándar. En C ,y en la m ayoría de los lenguajes,los dispositivos de E/S se tratan com o ficheros de texto.Son archivos predefinidos que no requieren ser abiertos porelprogram ador.Las variables de tipo fichero definidas son: stdin Entrada estándar Teclado stdout Salida estándar Pantalla stderr Salida estd.de error Pantalla stdprn Im presora estándar Im presora Porejem plo,son equivalentes: fgetc(stdin) <-> getchar() fputc(c,stdout) <-> putchar() Tam bién se pueden desviarlos datos hacia otros dispositivos m anipulando los ficheros correspondientes: fputc(c,stdprn); fprintf(stdprn,form ato,listaVariables); Tem a 8:Ficheros en C Fundam entos de Program ación 9 8.2.6.Errores en Tratam iento de Ficheros. Se pueden darsituaciones de errorcom o: N o reste espacio libre en disco,que elS.O .no haya encontrado elfichero que se quiera abrir,que los disquetes se encuentren protegidos contra escritura... Es responsabilidad delprogram adorcontrolartodas estas situaciones, sobretodo a la hora de abrirun fichero: if((f=fopen(“TEXTO .TXT”,”r”))== N U LL) rutinaError(); o tam bién: if(ferror(f)) rutinaError(); Tem a 8:Ficheros en C Fundam entos de Program ación 10 8.3.Ejem plos:C reación/visualización de un fichero void crearFi() #include <stdio.h> #define kC IER TO 1 { charc; #define kFALSO 0 FILE *f; if((f=fopen(“C :\\D ATO S.TXT”,”w ”))==N U LL) intm enu() puts(“Erroren Apertura Fichero”); { inti; else { printf(“\n\n PR O C ESO C O N FIC H ER O ”); printf(“\n\nIntroduce los datos:\n); printf(“\n\n1.C reación de un Fichero”); printf(“\n2.Visualización de un Fichero”); c=getchar(); printf(“\n3.Fialización”); w hile (c!= ‘\n’) { do { fputc(c,f); printf(“\n Elige una opción: “); c=getchar(); } scanf(“% d”,&i); getchar(); } w hile (i<0 ||i>3); } return(i); fclose(f); } return; } Tem a 8:Ficheros en C Fundam entos de Program ación 11 Ejem plo:C ont. m ain() {intfin; void leerFi() {if((f=fopen(“C :\\D ATO S.TXT”,”r”))==N U LL) puts(“ER R O R en Apertura-Lectura”); else { printf(“\n\nSalida de datos:\n”); w hile (!feof(f)) putchar(fgetc(f)); fclose(f); } return; } void crearFi(void); void leerFi(void); intm enu(void); for(fin= kC IER TO ;fin;) { sw itch (m enu()) { case 1:crearFi(); break; case 2:leerFi(); break; case 3:fin=kFALSE; } } Tem a 8:Ficheros en C } Fundam entos de Program ación 12 Ejem plo:A brir fichero,leer palabras e im prim irlas #include <stdio.h> #define fichero "c:\\autoexec.bat" intm ain(void) { FILE *pf; charpalabra[80]; if((pf=fopen(fichero,"r"))==N U LL) /*Abrim os fich sólo leer*/ printf("\nErrorde Apertura delfichero\n"); else { fscanf(pf,"% s",&palabra); w hile (!feof(pf)){ /* M ientras no acabe elfichero*/ printf("% s\n",palabra); fscanf(pf,"% s",&palabra); } } fclose(pf); /* C erram os elfichero*/ return 0; } Tem a 8:Ficheros en C Fundam entos de Program ación 13 Ejem plo:C rear/visualizar un Fichero con R egistro #include <stdio.h> #define kC IER TO 1 #define kFALSO 0 typedefstruct{ charcurso; intnum ; }registro; FILE *f; intm enu() { inti; printf(“\n\n PR O C ESO FI-R EG ISTR O ”); printf(“\n\n1.C reación de un Fichero”); printf(“\n2.Visualización de un Fichero”); printf(“\n3.Fialización”); do { printf(“\n Elige una opción: “); scanf(“% d”,&i); getchar(); } w hile (i<0 ||i>3); return(i); } Tem a 8:Ficheros en C registro leerD atos() { registro alum ; printf(“\nC urso:“); scanf(“% c”,&alum .curso);getchar(); if(alum .curso != ‘Z’) { /* fin con Z */ printf(“\nN úm ero: “); scanf(“% d”,&alum .num );getchar(); } return(alum ); } void visualizarD atos(registro alum ) { printf(“\nC urso:% c N úm ero: % d”, alum .curso,alum .num ); return; } Fundam entos de Program ación 14 Ejem plo:C ont. void leerFi() {registro alum ; void visualizarD atos(registro); if((f=fopen(“C :D ATO S.TXT”,”r”))==N U LL) puts(“ER R O R en Apertura-Lectura”); else { printf(“\n\nSalida de datos:\n”); w hile (!feof(f)) { fscanf(f,”% c% 4d\n”,&alum .curso, &alum .num ); visualizarD atos(alum );} fclose(f); } return; } void crearFi() {registro alum ; registro leerD atos(void); if((f=fopen(“C :D ATO S.TXT”,”w ”)==N U LL) puts(“ER R O R en Apertura-escritura”); else { printf(“\n\nIntroduce los datos:\n”); alum = leerD atos(); w hile (alum .curso !=‘Z’) { fprintf(f,”% c% 4d\n”,alum .curso, alum .num ); alum = leerD atos(); } } fclose(f); return; } m ain() {intfin,m enu(void); void crearFi(void),leerFi(void); for(fin= kC IER TO ;fin;) { sw itch (m enu()) { case 1:crearFi(); break; case 2:leerFi(); break; case 3:fin=kFALSE; } Tem a 8:Ficheros en C } } Fundam entos de Program ación 15 Ejem plo:Variante m anipulador ficheros. #include <stdio.h> #include<stdlib.h> FILE *f; m ain() { charseleccion[2],nom bre_archivo[13],eleccion[2]; intvalor_seleccion,caracter; printf(“Seleccione porelnúm ero su opción\n”); printf(“1)C rearun nuevo fichero.\n”); printf(“2)Escribirdatos sobre un fichero existente.\n”); printf(“3)Añadirdatos a un fichero existente.\n”); printf(“4)Leerdatos de un fichero existente.\n”); do { printf(“Su elección es -->”); gets(eleccion); valor_seleccion= atoi(eleccion); sw itch(valor_seleccion) { Tem a 8:Ficheros en C Fundam entos de Program ación 16 Ejem plo:C ont. case 1:/*crearun nuevo fichero */ case 2:/*escribirsobre archivo existente */ strcpy(seleccion,”w ”); break; case 3:/* Añadirdatos a un fichero existente,o no */ strcpy(seleccion,”a”); break; case 4:/* Leerdatos de un fichero existente */ strcpy(seleccion,“r”); break; default:{ printf(“Elección no válida.\n”); valor_seleccion=0; } } }w hile(valor_seleccion==0); printf(“Introduzca elnom bre delarchivo :“); gets(nom bre_archivo); if((f=fopen(nom bre_archivo,seleccion))==N U LL) { printf(“N o se puede abrirelarchivo % s “,nom bre_archivo); exit(-1); } Tem a 8:Ficheros en C Fundam entos de Program ación 17 Ejem plo:C ont sw itch(valor_seleccion) { case 1:break; case 2: case 3:{printf(“Introduzca los caracteres a grabar:\n”); w hile((caracter=getchar())!=‘#’) caracter=fputc(caracter,f); } break; case 4:{w hile((caracter=fgetc(f))!=EO F) printf(“% c”,caracter); } break; } fclose(f); } Tem a 8:Ficheros en C Fundam entos de Program ación 18