Bloque 9 Ficheros de texto
Ficheros Necesitamos un tipo de datos que nos permita guardar datos de forma permanente en el disco: ficheros El SO se encarga de gestionar físicamente el fichero A nosotros nos interesa la estructura de datos y las operaciones básicas (crear, abrir, escribir, leer y cerrar) para trabajar con los ficheros Nos centramos en ficheros de acceso secuencial, en concreto de texto (contienen caracteres)
La estructura FILE La estructura FILE es la que representa un fichero y está definida en stdio Gestiona información a nivel del SO (ubicación en memoria del buffer, posición del carácter actual en el buffer,...) Nunca declararemos variables de tipo FILE sino punteros a esa estructura Por ejemplo: FILE *f;
Abrir un fichero Función fopen (en stdio) FILE *f; f = fopen("nombrefitchero.extensión", "modo de apertura"); Ejemplo: FILE *f; f = fopen("hola.txt","r"); Modos de apertura Mode r w a Explicació obre el fitxer per lectura. Si el fitxer no existeix retorna un error obre el fitxer per escriptura. Si el fitxer existeix l esborra i si no en crea un de nou obre el fitxer per afegir text al final. Si el fitxer existeix ens situa al final del mateix i si no en crea un de nou
Cerrar un fichero Al acabar de utilizar un fichero hay que cerrarlo (y que el SO lo libere) Función fclose (en stdio) Ejemplo: fclose(f);
Leer y escribir Funciones getc y putc (en stdio) Ejemplo: char c; FILE *f1, *f2;... c=getc(f1); /*lee un carácter del fichero f1 y lo asigna a la variable c */... putc(c,f2); /*escribe el valor de la variable c en el fichero f2 */ Estas funciones avanzan el cursor o posición del carácter actual (es un acceso secuencial), antes de leer el carácter
Leer y escribir Si el fichero f contiene el texto hola (y está abierto en modo lectura) c=getc(f); el cursor avanza al primer carácter, lo lee ( h ) y lo asigna a la variable c Si ahora volvemos a ejecutar c=getc(f); el cursor pasa ahora al siguiente carácter, lo lee ( o ) y lo asigna a la variable c
Fin del fichero El carácter especial EOF indica que se ha llegado al final del fichero Todos los ficheros acaban con ese carácter
Ejemplo: impresión de un #include <stdio.h> void main() { FILE *f; char c; fichero completo f=fopen("fitxer.txt","r"); //obre el fitxer en mode lectura c=getc(f); //llegeix el primer caràcter while (c!=eof) //repeteix fins que arribi al final de fitxer { printf("%c",c); //escriu el caràcter llegit c=getc(f); //llegeix el següent caràcter } fclose(f); //tanca el fitxer }
Ejemplo: impresión de un #include <stdio.h> fichero completo (v.2) void main() { FILE *f; char c; f=fopen("fitxer.txt","r"); //obre el fitxer en mode lectura while ((c=getc(f))!=eof) //llegeix i compara amb EOF printf("%c",c); //escriu el caràcter llegit } fclose(f); //tanca el fitxer
Ejemplo: copia de un fichero a #include <stdio.h> void main() { FILE *fa, *fb; char c; otro fa=fopen("a.txt","r"); //obre el fitxer A per lectura fb=fopen("b.txt","w"); //obre el fitxer B per escriptura while ((c=getc(fa))!=eof) //llegeix i compara amb EOF putc(c,fb); //escriu el caràcter llegit a B } fclose(fa); //tanca el fitxer A fclose(fb); //tanca el fitxer B
Función feof Mira si el carácter actual (cursor) es el final del fichero (sin avanzar el cursor) Retorna un entero diferente 0 si es EOF y 0 si no lo es
Ejemplo: copia de un fichero a #include <stdio.h> void main() { FILE *fa, *fb; char c; otro (v.2) fa=fopen("a.txt","r"); //obre el fitxer A per lectura fb=fopen("b.txt","w"); //obre el fitxer B per escriptura c=getc(fa); //llegeix del fitxer A while (!feof(fa)) //comprova que no hem arribat al EOF d A { putc(c,fb); //escriu el caràcter llegit a B c=getc(fa); //llegeix del fitxer A } } fclose(fa); //tanca el fitxer A fclose(fb); //tanca el fitxer B
Lectura y escritura con formato Las funciones fscanf y fprintf son equivalentes a scanf y printf, pero leyendo o escribiendo en un fichero (el primer parámetro es el fichero) Ejemplos: fprintf(fitxer, %d\t%f, i, f); fscanf(fitxer, %d,&i); fscanf(fitxer, %f,&f); fscanf(fitxer, %s,cadena); /* donde i es int, f float, fitxer puntero a FILE y cadena un string */
Lectura y escritura por líneas Las funciones gets y puts también tienen sus equivalentes para trabajar con ficheros: fgets y fputs Ejemplos: fgets(cadena, num, fitxer); fputs(cadena, fitxer); /* donde num es int, fitxer puntero a FILE y cadena un string */
Entrada y salida estándar En C hay 3 ficheros especiales definidos en la librería stdio: stdin: la entrada estándar (por teclado) stdout: la salida estándar (por pantalla) stderr: la salida estándar de errores Son equivalentes: fprintf(stdout, %d, i); printf( %d, i); Son equivalentes: fscanf(stdin, %d, &i); scanf( %d, &i);