tema 10c manejo de archivos de datos en c. archivos de números para leer datos desde un archivo de...

25
Tema 10c Manejo de archivos de datos en C

Upload: benita-ascencio

Post on 23-Jan-2016

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

Tema 10c

Manejo de archivos de datos en C

Page 2: 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

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.

Page 3: 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

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

Page 4: 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

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);

}}

Page 5: 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

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

Page 6: 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

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

Page 7: 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

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

Page 8: 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

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

Page 9: 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

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

Page 10: 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

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

Page 11: 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

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

Page 12: 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

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);

}}

Page 13: 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

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

Page 14: 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

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.

Page 15: 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

Archivos binarios

struct pokemon{

char nombre[12];

int tipo; //0: fuego, 1:planta, //2:agua,

3:electrico

double fuerza;

double energia;

};

Page 16: 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

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);

}}

Page 17: 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

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

Page 18: 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

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

Page 19: 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

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.

Page 20: 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

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

Page 21: 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

Archivos binarios

• fseek– Origen:

• SEEK_SET: Principio del archivo

• SEEK_CUR: Posición actual

• SEEK_END: Fin del archivo

Page 22: 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

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

Page 23: 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

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

Page 24: 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

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

Page 25: 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

Fin Tema 10c

Manejo de archivos de datos en C