1 / 25

Tema 10c

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 .

sahkyo
Download Presentation

Tema 10c

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Tema 10c Manejo de archivos de datos en C

  2. 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.

  3. Archivos de números • Ejemplo: Archivo de texto con números en un formato fijo 1 2 3 4 7, 8, 9, 10 1.4 ; 0.7 ; 9.001 ; 67.0

  4. 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); } }

  5. 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 3 everton 5 cobreloa 1 u.Catolica 2 wanderers 3

  6. 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; }

  7. 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

  8. Archivos binarios • fread • Lee datos binarios desde un archivo • size_t fread( void* buffer, size_t num_bytes, size_t cuenta, FILE* fp); Variable donde dejar la información leída Tamaño del tipo de dato unsigned int, Número de bytes leídos Numero de elementos A leer Flujo desde donde leer

  9. Archivos binarios • fwrite • Escribe datos binarios a un archivo • size_t fwrite( void* buffer, size_t num_bytes, size_t cuenta, FILE* fp); Variable desde donde tomar la información Tamaño del tipo de dato unsigned int, Número de bytes escritos Numero de elementos A escribir Flujo donde se debe escribir

  10. 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

  11. Archivos binarios void 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); } }

  12. 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); } }

  13. 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; }

  14. 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.

  15. Archivos binarios struct pokemon{ char nombre[12]; int tipo; //0: fuego, 1:planta, //2:agua, 3:electrico double fuerza; double energia; };

  16. 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); } }

  17. 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); }

  18. 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); } }

  19. 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.

  20. 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 Numero de bytes a mover el cursor Desde donde contar nbytes Descriptor de archivo

  21. Archivos binarios • fseek • Origen: • SEEK_SET: Principio del archivo • SEEK_CUR: Posición actual • SEEK_END: Fin del archivo

  22. 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

  23. 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); } }

  24. 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); } }

  25. Fin Tema 10c Manejo de archivos de datos en C

More Related