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