Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/04/2010, 04:14
minette1988
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 10 meses
Puntos: 0
eliminar un registro en C

Hola, tengo el siguiente fichero binario donde doy de alta a los ciclistas, busco una ficha usando el dorsal para actualizar el tiempo acumulado, sumo los tiempos de los miembros del equipo y me falta ordenar el fichero según el tiempo de los corredores. ¿Cómo puedo ordenar el fichero por tiempos de menor a mayor?. Gracias.

Código C:
Ver original
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CAR(c)\
  6.           c=getchar();\
  7.           while((c=='\n') || (c==' ') || (c=='\t'))\
  8.             c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0;\
  11.                        c[i]=getchar();\
  12.                        while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.                        while((c[i]!='\n') && (i<(n-1))){ \
  14.                           i++;\
  15.                           c[i]=getchar(); }\
  16.                        c[i]='\0';}
  17.  
  18. typedef struct{
  19.          char valido;
  20.          char num_dorsal[3];
  21.          char equipo[50];
  22.          char nom[50];
  23.          char ape[50];
  24.          char nacionalidad[50];
  25.          float tiempo_acum;
  26. }ciclista;
  27.  
  28. void alta_ciclista (FILE *);
  29. void modif_fich (FILE *);
  30. float total_tiempos (FILE *);
  31. void eliminar_eliminar_registro (FILE *);
  32.  
  33. int main(){
  34.           char op;
  35.           FILE *pf;
  36.          
  37.           if((pf=fopen("ciclistas.dat", "ab+"))==NULL){
  38.               fprintf(stderr, "Error al abrir el fichero ciclistas.dat.\n");
  39.               exit(1);}
  40.  
  41.           do{
  42.              printf("a-->Alta\nb--> Buscar/Modificar ficha\nt--> Total tiempos\nx--> Borrar fichero y salir\n");
  43.              printf("Elija opcion(s--> Salir): ");
  44.              LEE_CAR(op);
  45.  
  46.              switch(op){
  47.                   case 'a':
  48.                   case 'A': {alta_ciclista(pf); break;}
  49.                   case 'b':
  50.                   case 'B': {modif_fich(pf); break;}
  51.                   case 't':
  52.                   case 'T': {printf("\n%s %.2f\n","El total de los tiempos es:",total_tiempos(pf)); break;}
  53.                   case 'x':
  54.                   case 'X': {fclose(pf); pf=NULL; remove("ciclistas.dat"); op='s'; break;}
  55.              }
  56.           }while((op != 's') && (op != 'S'));
  57.           if(pf != NULL)
  58.             if(fclose(pf) == EOF)
  59.                fprintf(stderr, "Error al cerrar el fichero ciclistas.dat.\n");
  60.                exit(0);
  61. }
  62.  
  63. void alta_ciclista(FILE *d){
  64.           ciclista participante;
  65.  
  66.           printf("Número del dorsal: ");
  67.           scanf("%2s", participante.num_dorsal);
  68.           printf("Equipo: ");
  69.           LEE_CAD(participante.equipo, 50);
  70.           printf("Nombre: ");
  71.           LEE_CAD(participante.nom, 50);
  72.           printf("Apellido: ");
  73.           LEE_CAD(participante.ape, 50);  
  74.           printf("Nacionalidad: ");
  75.           LEE_CAD(participante.nacionalidad, 50);
  76.           printf("Tiempo acumulado: ");
  77.           scanf("%f", &participante.tiempo_acum);
  78.           fwrite(&participante, sizeof(participante), 1, d);
  79. }
  80.  
  81. void modif_fich(FILE *d){
  82.           char op;
  83.           char num_dorsal[3];
  84.           ciclista parti;
  85.           int comp;
  86.           FILE *aux;
  87.  
  88.           if((aux=fopen("ciclistas.dat", "wb+"))!=NULL){
  89.               printf("Número del dorsal a buscar/modificar: ");
  90.               scanf("%2s", num_dorsal);
  91.               rewind(d);
  92.               fread(&parti, sizeof(parti), 1, d);
  93.               comp=strcmp(parti.num_dorsal, num_dorsal);
  94.               while((comp != 0) && (!feof(d))){
  95.                   fwrite(&parti, sizeof(parti), 1, aux);
  96.                   fread(&parti, sizeof(parti), 1, d);
  97.                   comp=strcmp(parti.num_dorsal, num_dorsal);}
  98.               if(comp == 0){
  99.                  printf("Ciclista encontrado:\n");
  100.                  printf("%s\n%s\n%s\n%s\n%s\n%.2f\n", parti.num_dorsal, parti.equipo, parti.nom, parti.ape, parti.nacionalidad, parti.tiempo_acum);
  101.                  printf("Modificar tiempo (s/n)?");
  102.                  LEE_CAR(op);
  103.                  if((op=='s') || (op=='S')){
  104.                     printf("Tiempo acumulado: ");
  105.                     scanf("%f", &parti.tiempo_acum);
  106.                     fwrite(&parti, sizeof(parti), 1, aux);
  107.                     fread(&parti, sizeof(parti), 1, d);
  108.                      while(!feof(d)){
  109.                          fwrite(&parti, sizeof(parti), 1, aux);
  110.                          fread(&parti, sizeof(parti), 1, d);}
  111.                      if(fclose(aux) == EOF)
  112.                         fprintf(stderr, "Error al cerrar el fichero ciclistas.dat.\n");        
  113.                      remove("ciclistas.dat");
  114.                      rename("ciclistas.aux", "ciclistas.dat");
  115.                      if((d=fopen("ciclistas.dat", "ab+"))==NULL){
  116.                         fprintf(stderr, "Error al abrir el fichero ciclistas.dat.\n");
  117.                         exit(2);}
  118.                  }
  119.                  else{
  120.                    if(fclose(aux) == EOF)
  121.                      fprintf(stderr, "Error al cerrar el fichero ciclistas.aux.\n");
  122.                  }
  123.               }  
  124.               else{
  125.                  printf("Ciclista no encontrado.\n");
  126.                  if(fclose(aux) == EOF)
  127.                    fprintf(stderr, "Error al cerrar el fichero ciclistas.aux.\n");
  128.               }  
  129.           }    
  130. }
  131.  
  132. float total_tiempos(FILE *d){
  133.            ciclista parti;
  134.            float total=0.0;
  135.            rewind(d);
  136.            fread(&parti,sizeof(parti),1,d);
  137.            while(!feof(d)){
  138.               total+=parti.tiempo_acum;
  139.               fread(&parti,sizeof(parti),1,d);
  140.            }
  141.            return(total);
  142. }