Ing. Informática Programación I Bloque 9 Ficheros de texto Bloque 9 Ing. Informática Programación I Bloque 9 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) Ing. Informática Programación I 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; Bloque 9 Ing. Informática Programación I Bloque 9 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 Explicació “r” obre el fitxer per lectura. Si el fitxer no existeix retorna un error “w” obre el fitxer per escriptura. Si el fitxer existeix l’esborra i si no en crea un de nou “a” 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 Ing. Informática Programación I 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); Bloque 9 Ing. Informática Programación I Bloque 9 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 Ing. Informática Programación I 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 Bloque 9 Ing. Informática Programación I 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 Bloque 9 Ing. Informática Programación I Ejemplo: impresión de un fichero completo #include <stdio.h> void main() { FILE *f; char c; 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 } Bloque 9 Ing. Informática Programación I Ejemplo: impresión de un fichero completo (v.2) #include <stdio.h> 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 Bloque 9 Ing. Informática Programación I Ejemplo: copia de un fichero a otro #include <stdio.h> void main() { FILE *fa, *fb; char c; 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 } Bloque 9 Ing. Informática Programación I 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 Bloque 9 Ing. Informática Programación I Ejemplo: copia de un fichero a otro (v.2) #include <stdio.h> void main() { FILE *fa, *fb; char c; 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 } Bloque 9 Ing. Informática Programación I Bloque 9 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 */ Ing. Informática Programación I Bloque 9 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 */ Ing. Informática Programación I 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); Bloque 9