Breve 10 Archivos de datos Fundamentos de Informática ¿Qué es un archivo? Un archivo es un dispositivo de entrada‐salida cuyo fin ultimo es guardar o proporcionar información • Utilizaremos archivos secuenciales. • Operaciones con archivos: • – • Apertura de archivos: fopen(), Cierre de archivos: fclose(), Lectura de archivos, Escritura en archivos. Es necesario establecer un área de buffer. Almacena la información mientras se está transfiriendo hacia o desde el fichero. FILE *punt_fichero; • Apertura. Prototipo: FILE *fopen (char * nombre_completo_archivo, char *modo); Modo: “r”, “w”, “a”, “r+”, “w+”, “a+”, b • Cierre de un archivo: fclose(). Prototipo: int fclose(FILE *puntero_al_archivo); Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI Breve 10: Archivos de datos 2 Archivos: apertura y cierre #include <stdio.h> int main(void) { FILE *pfich; Declaración de un puntero a archivo pfich = fopen(“datos.txt”,”w”); Apertura en modo escritura (w) del archivo “datos.txt” Comprobación de que la if (pfich == NULL) { apertura ha sido correcta printf(“\n Error al abrir el fichero”); }else{ ... /* Se utiliza el archivo para escritura */ /* Al acabar de usar el archivo */ if (fclose(pfich) != 0) { printf(”\n Error al cerrar el archivo “); Cierre del archivo y comprobación de } si se ha realizado correctamente } } Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI Breve 10: Archivos de datos 3 Archivos: lectura y escritura • Tipos de archivos: de texto y binarios • La lectura y escritura de archivos varía según el tipo de archivos: Texto: fprintf, fscanf, getc, putc, fgets, fputs – Binarios: fwrite, fread, fseek – • TEXTO – fprintf(): como printf() salvo que hay que indicar en qué archivo se escribe • Valor de retorno: – – – Éxito: devuelve el número de bytes que ha escrito Fracaso: devuelve EOF fscanf(): como scanf() salvo que hay que indicar en qué archivo ha de leer • Valor de retorno (cuando sólo se lee un valor): – – – Éxito: devuelve el valor 1 si ha leído correctamente Fracaso: devuelve 0 si ha ocurrido un error en la lectura por una mala especificación de formato. EOF: si no se ha leído nada porque se ha llegado al final del archivo Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI Breve 10: Archivos de datos 4 fscanf() , fprintf() #include <stdio.h> int main(void) { int n; /* Valor devuelto por fscanf */ FILE *pfich; /* Puntero al archivo */ double dato; /* dato leído del fichero */ double sum_tot; /* Suma de los datos */ Programa que lee el archivo "pepe" que contiene números en punto flotante y calcula su suma pfich = fopen("pepe.txt", "r+"); if (pfich == NULL){ printf("Error: No se puede abrir el fichero \"pepe\"\n"); } else{ sum_tot = 0; /* Inicialización de la suma antes de entrar en el bucle*/ n = fscanf(pfich, “ %lf ", &dato); while (n== 1) { /* termina en cuanto ocurra un error de lectura*/ sum_tot+=dato; n = fscanf(pfich, “ %lf ", &dato); } printf("El valor de la suma es: %f\n", sum_tot); fprintf(pfich,“\nEl valor de la suma es: %f”, sum_tot); if( fclose(pfich) != 0){ printf("Error al cerrar el fichero\n");} } return 0; } Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI Breve 10: Archivos de datos 5 Carácter: getc()/fgetc(), putc()/fputc() • Lectura de un carácter: int fgetc(FILE *puntero_a_archivo) (o igual con getc) Leen el siguiente carácter del archivo. – Valor de retorno: • Éxito: el carácter leído • Fracaso: Si llega al final de fichero u ocurre un error, el valor de retorno es EOF. – • Escritura de un carácter: int fputc(int car, FILE * punt_a_arch) (o igual con putc) ‐ Escriben el carácter car en el archivo al que apunta punt_a_arch ‐ Valor de retorno: • Éxito: el propio carácter escrito • Error: EOF Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI Breve 10: Archivos de datos 6 Cadena de caracteres: fgets(), fputs() • Lectura de una cadena de caracteres: char * fgets(char *cadena, int tam_cad, FILE *punt_a_arch) La cadena leída se almacena en esta variable – Valor de retorno: • • • Al final de la cadena siempre se añade el ‘\0’ La lectura termina cuando: - Encuentra el \n (que sí se copia) - Encuentra el fin de fich (no se escribe \n) - Se han leído (tam_cad-1) caracteres Éxito: es un puntero a la cadena leída. Fracaso: NULL, si se llega al final de fichero u ocurre un error Escritura de una cadena de caracteres: int fputs(const char *cadena, FILE *punt_a_arch) – Valor de retorno: • • Escribe la cadena en el archivo al que apunta punt_a_arch SIN EL ‘\0’ DEL FINAL Éxito: número positivo si se ha escrito la cadena correctamente Error: EOF Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI Breve 10: Archivos de datos 7 Archivos binarios • Los archivos binarios se utilizan para almacenar la información como una copia exacta de la memoria del ordenador • Permite escribir los bloques de una sola vez sin necesidad de escribir cada uno de sus componentes • Escritura: size_t fwrite(void *estructura, size_t tam, size_t numero, FILE *archivo); • • Toma un número (tam* numero) de bytes de la memoria a partir de la dirección estructura y los escribe en el archivo. Lectura: size_t fread (void *estructura, size_t tam, size_t numero, FILE *archivo); • Lee del archivo un número (tam* numero) de bytes y los guarda a partir de la dirección de memoria estructura. Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI Breve 10: Archivos de datos 8 Archivos binarios #include <stdio.h> #include <stdlib.h> typedef char T_Cadena30[30]; typedef struct{ T_Cadena30 nombre; int edad; }T_Ficha; int main(void) { FILE *punt; T_Ficha ficha; T_Ficha ficha2; punt=fopen("a:\\datos.dat","wb"); if (punt==NULL) { printf("\n Error al abrir el fichero "); }else{ printf("Introduzca el nombre de la persona:\n"); gets(ficha.nombre); printf("Introduzca la edad de la persona:\n"); scanf("%d",&ficha.edad); fwrite(&ficha, sizeof(T_Ficha), 1, punt); if (fclose(punt) != 0) { printf(“Error al cerrar el fichero “); } } Departamento de Sistemas Informáticos Escuela Técnica Superior de Ingeniería ICAI punt=fopen("a:\\datos.dat","rb"); if (punt==NULL) { printf("\n Error al abrir el fichero "); }else{ puts("\nYa hemos leido el fichero y contiene:\n"); fread(&ficha2, sizeof(T_Ficha), 1 , punt); printf("NOMBRE: "); puts(ficha2.nombre); printf("EDAD: "); printf("%d",ficha2.edad); if (fclose(punt) != 0) { printf(“Error al cerrar el fichero “); } } return 0; } Breve 10: Archivos de datos 9