breve_10

Anuncio
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
Descargar