tema 10c
DESCRIPTION
Tema 10c. Manejo de archivos de datos en C. Archivos de números. Para leer datos desde un archivo de texto como enteros (o números en general) se puede utilizar fscanf . Para escribir datos numéricos en archivos de texto se puede utilizar fprintf . - PowerPoint PPT PresentationTRANSCRIPT
Tema 10c
Manejo de archivos de datos en C
Archivos de números
• Para leer datos desde un archivo de texto como enteros (o números en general) se puede utilizar fscanf.
• Para escribir datos numéricos en archivos de texto se puede utilizar fprintf.
• Los archivos deben ser abiertos en modo texto.• Se utilizan las conversiones %d y %f ya vistas.
Archivos de números
• Ejemplo: Archivo de texto con números en un formato fijo
1 2 3 47, 8, 9, 101.4 ; 0.7 ; 9.001 ; 67.0
Archivos de números#include <stdio.h>
int main(){ FILE* archivo;
archivo = fopen("test3.txt","r"); if(archivo!=NULL){ int ds[4],i;
double fs[4];fscanf(archivo,"%d %d %d %d\n",
&ds[0],&ds[1],&ds[2],&ds[3]);fscanf(archivo,"%d, %d, %d, %d\n",
&ds[0],&ds[1],&ds[2],&ds[3]); fscanf(archivo,"%lf ; %lf ; %lf ; %lf\n"
&fs[0],&fs[1],&fs[2],&fs[3]);fclose(archivo);
}}
Archivos mixtos
• Archivos de texto con datos alfanuméricos
• Basta con especificar el tipo de conversión deseada para cada tipo de dato.
colo-colo 0 huachipato 3everton 5 cobreloa 1u.Catolica 2 wanderers 3
Archivos mixtos#include <stdio.h>
int main(){ FILE* archivo;
archivo = fopen("test4.txt","r"); if(archivo!=NULL){ char visita[32], local[32]; int gvisita, glocal; int r=4; while(1){ r=fscanf(archivo,"%s %d %s %d\n",
local,&glocal,visita,&gvisita); if(r!=4) break; if(glocal>gvisita) printf("Gana local (%s)\n",local); else if(glocal<gvisita) printf("Gana visita (%s)\
n",visita); else printf("Empate\n"); } fclose(archivo); } return 1;}
Archivos binarios
• Deben ser abiertos en modo binario.
• La información se guarda en formato binario.
• Si se abre el archivo con un editor de texto, aparece basura.
• Se pueden intercalar distintos tipos de datos
Archivos binarios
• fread– Lee datos binarios desde un archivo
– size_t fread(void* buffer,
size_t num_bytes,
size_t cuenta,
FILE* fp);
unsigned int,Número de bytes leídos
Variable donde dejar la información leída
Tamaño del tipode dato
Numero de elementosA leer
Flujo desde donde leer
Archivos binarios
• fwrite– Escribe datos binarios a un archivo
– size_t fwrite(void* buffer,
size_t num_bytes,
size_t cuenta,
FILE* fp);
unsigned int,Número de bytes escritos
Variable desde dondetomar la información
Tamaño del tipode dato
Numero de elementosA escribir
Flujo donde se debe escribir
Archivos binarios
• sizeof– Entrega en numero de bytes que ocupa un tipo de dato
– Es un operador calculado en tiempo de compilación.
sizeof(int) 4
int i;
sizeof(i) 4
Archivos binariosvoid escribir(FILE* archivo){
archivo = fopen("test5.dat","w+b");if(archivo!=NULL){
int i,k;k=1;for(i=0;i<10;i++){
size_t ws;ws = fwrite(&k,sizeof(k),1,archivo);k=k*2;printf("%d enteros escritos
en %d bytes\n",ws, ws*sizeof(int));
} fclose(archivo); }}
Archivos binarios
void leer(FILE* archivo){archivo = fopen("test5.dat","r+b");if(archivo!=NULL){
int i,k;while(fread(&k,sizeof(int),1,archivo)==1)
{printf("%d\n",k);}fclose(archivo);
}}
Archivos binarios
int main(int argc, char* argv[]){ FILE* archivo; printf("%s",argv[1]); if(argc>1 && strcmp(argv[1],"w")==0) escribir(archivo); else leer(archivo); return 1;}
Archivos binarios
• Así como se puede leer y escribir datos simples, también se pueden leer y escribir datos estructurados.
• El esquema es el mismo, basta con especificar el tamaño correcto.
Archivos binarios
struct pokemon{
char nombre[12];
int tipo; //0: fuego, 1:planta, //2:agua,
3:electrico
double fuerza;
double energia;
};
Archivos binarios
void escribir(FILE* archivo){archivo = fopen("test6.dat","w+b");if(archivo!=NULL){
int i,k;struct pokemon pk1, pk2, pk3;strcpy(pk1.nombre,"pikachu");pk1.tipo=3;pk1.fuerza=120;pk1.energia=87;…fwrite(&pk1,sizeof(struct pokemon),1,archivo);fwrite(&pk2,sizeof(struct pokemon),1,archivo);fwrite(&pk3,sizeof(struct pokemon),1,archivo);fclose(archivo);
}}
Archivos binarios
void escribir(FILE* archivo){ archivo = fopen("test6.dat","w+b"); if(archivo!=NULL){ int i,k; size_t wb; struct pokemon pk[3]; strcpy(pk[0].nombre,"pikachu"); pk[0].tipo=3; pk[0].fuerza=120; pk[0].energia=87; wb = fwrite(pk,sizeof(struct pokemon),3,archivo); printf("%d bytes escritos
en %d elementos\n",wb*sizeof(struct pokemon), wb);
fclose(archivo); }
Archivos binarios
void leer(FILE* archivo){ printf("Leyendo\n"); archivo = fopen("test6.dat","r+b"); if(archivo!=NULL){ int i; struct pokemon pk; while(fread(&pk,sizeof(struct pokemon),1,archivo)==1){ printf("%s\n",pk.nombre); } fclose(archivo); }}
Archivos binarios
• En archivos binarios ya no es necesario realizar accesos secuenciales.
• Es muy natural realizar accesos a estructuras de datos especificas, tanto para lectura como para escritura.
Archivos binarios
• fseek– Mueve el cursor de lectura escritura a una
posición especifica del archivo
– int fseek(FILE* f, long nbytes, int origen);
Cero en caso de éxito,distinto de cero en error
Descriptor de archivo
Numero de bytes amover el cursor
Desde donde contar nbytes
Archivos binarios
• fseek– Origen:
• SEEK_SET: Principio del archivo
• SEEK_CUR: Posición actual
• SEEK_END: Fin del archivo
Archivos binarios
• ftell– Indica la posición actual en el archivo (bytes
respecto al inicio)
– long int ftell(FILE* f);
Posición del archivo,-1 en caso de error. Descriptor de archivo
Archivos binarios
void leern(FILE* archivo, int n){ printf("Leyendo %d\n",n); archivo = fopen("test6.dat","r+b"); if(archivo!=NULL){ int i; struct pokemon pk; fseek(archivo, n*sizeof(struct pokemon),SEEK_SET); fread(&pk,sizeof(struct pokemon),1,archivo); printf("%s\n",pk.nombre); fclose(archivo); }}
Archivos binarios
void leerrev(FILE* archivo){ archivo = fopen("test6.dat","r+b"); if(archivo!=NULL){ int i; struct pokemon pk; fseek(archivo,-1*sizeof(struct pokemon),SEEK_END); while(fread(&pk,sizeof(struct pokemon),1,archivo)==1){ printf("%s\n",pk.nombre); fseek(archivo,-2*sizeof(struct pokemon),SEEK_CUR); } fclose(archivo); }}
Fin Tema 10c
Manejo de archivos de datos en C