[Aporte] Archivos Binarios en C

Iniciado por nicolasblues86, 19 Mayo 2010, 23:38 PM

0 Miembros y 1 Visitante están viendo este tema.

nicolasblues86

consiste en dos programas  en el primero se hacen la entrada de datos y en el segundo se realizan modificaciones...
mucha ganas de explicarlo no tengo  :P jeje de ultima si no se entiende un joroca me explico con mas detalle mas tarde..

arch.h




#include <stdio.h>

typedef struct FECHA{

int d, m, a;
}fecha;

typedef struct TIEMPO{

int h, m, s;

}tiempo;

struct atleta{

char nombre[30];
fecha f;
char sx; //sexo
char cat; //categoria
tiempo t;
unsigned int dorsal;
unsigned short puesto;

};

typedef struct atleta atle;
#define desplz(n) (n-1) *sizeof (atle)



archivo de entrada.c




#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "atleta.h"
#define randomize (srand(time(NULL)))
#define random(num) (rand()%(num))

void inicializar (FILE* pf);
void igresar_A (FILE* pf, atle* at);
unsigned numdorsal (char s, char cat, FILE * pf);



int main(int argc, char** argv)
{
FILE *pf;
atle atletas;
char *archivo = "Carrera.dat";
randomize;

if ((pf= fopen( archivo, "wb+")) == NULL)
{
printf ("\n Error al abrir archivo ");
return -1;
}

inicializar(pf);

igresar_A(pf, &atletas);
do
{
fseek(pf, desplz(atletas.dorsal), 0);
fwrite (&atletas, sizeof(atletas),1,pf);
igresar_A(pf, &atletas);

}while (strcmp (atletas.nombre, "FIN"));



fclose (pf);


return 0;
}

void inicializar (FILE* pf)
{
int i;
atle a;

a.nombre[0] = '\0';

for (i=0; i<1000; i++)
fwrite(&a, sizeof(atle), 1, pf);


}

void igresar_A (FILE* pf, atle* at)
{
char buf[30];
int n;

buf[0]='\0';
printf ("Nombre    ");
fgets (buf, 30, stdin);
n = strlen (buf);
if (buf[n] == '\n');
buf[n] = '\0';

sscanf(buf,"%s", at->nombre);
if (strcmp (at->nombre, "FIN"))
{
printf ("ingrese la fecha de naciemiento (dd mm aaaa)");
buf[0]='\0';
fgets (buf, 30, stdin);
sscanf (buf, "%d %d %d", &at->f.d, &at->f.m, &at->f.a);
if (at->f.a < 1954)
at->cat = 'V';
else
at->cat = 'S';

printf ("Sexo (M/F)");
fgets (buf, 3, stdin);
sscanf (buf, "%c", &at->sx);

at->sx = (char) toupper(at->sx);


at->t.h = 0;
at->t.m = 0;
at->t.s = 0;

at->dorsal = numdorsal(at->sx, at->cat, pf);
printf ("%d", at->dorsal);

}
}

unsigned numdorsal (char s, char cat, FILE * pf)

{
unsigned base, tope, d;
atle at;

if (s == 'M' && cat=='V')
{
base = 251;
tope = 500;
}
else if (s == 'M' && cat == 'S')
{
base = 501;
tope = 1000;
}
else if (s == 'F' && cat == 'V')
{
base = 51;
tope = 100;
}
else if (s == 'F' && cat == 'S')
{
base = 101;
tope = 200;
}

d = (unsigned) random(tope+1-base)+base;
fseek(pf, desplz(d),0);
fread(&at,sizeof(atle),1,pf);
if (!(*at.nombre))
return d;
else
return numdorsal(s, cat, pf);

}




archivo de entrada a tiempos de atletas.c





#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "atleta.h"


void muestraDatos (atle at);
void dorsalesjuego (FILE* pf );


int main(int argc, char** argv)
{
FILE * pf;
atle atletas;

unsigned dorsal1;
char dor[20], *archivo = "Carrera.dat";


if ((pf = fopen (archivo, "rb+")) == NULL)
{
printf ("Error al abrir archivo");
return -1;
}

dorsalesjuego(pf);

printf ("Escriba el numero de dorsal: ");
fgets (dor, 5, stdin);
sscanf (dor, "%u", &dorsal1);
while (dorsal1)
{
fseek(pf,desplz(dorsal1), 0);
fread(&atletas, sizeof(atletas),1,pf);

if (*atletas.nombre)
{

muestraDatos(atletas);
printf ("\n Tiempo realizado en minutos y segundos: ");
   fgets (dor, 15, stdin);
   sscanf (dor, "%d %d", &atletas.t.m, &atletas.t.s);
   fseek(pf,desplz(dorsal1), 0);
   fwrite(&atletas, sizeof(atle),1,pf);
}
else
printf ("Dorsal no encontrado, vuelva a intentar\n");

fgets (dor, 5, stdin);
sscanf (dor, "%u", &dorsal1);

}


fclose(pf);




return 0;
}


void muestraDatos (atle at)

{
printf ("Nombre : %s\n", at.nombre);
printf ("Fecha de naciemiento : %d-%d-%d\n", at.f.d, at.f.m, at.f.a);
printf ("Categoria : %c\nDorsal: %u\n", at.cat, at.dorsal);
if (at.t.m > 0)
printf ("\ntiempo de carrera : %d Min %d Seg", at.t.m, at.t.s );



}


void dorsalesjuego (FILE* pf )

{
atle at;

printf ("jugadores en jeugo \n");

while ( !feof(pf) )
{
fread (&at, sizeof(atle),1,pf);
if (*at.nombre)
printf ("numero de dorsal %d\n", at.dorsal);
}


}




eso fue todo saludos


 
Solamente hay 10 clases de personas en el mundo los que saben leer binario y los que no