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

Documentos relacionados