Foros del Web » Programación para mayores de 30 ;) » C/C++ »

eliminar un registro en C

Estas en el tema de eliminar un registro en C en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/04/2010, 04:14
 
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. }
  #2 (permalink)  
Antiguo 27/04/2010, 09:47
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: eliminar un registro en C

Tienes 2 formas:

1.- Cargar el fichero en un arreglo de registro y ordenarlos, puedes usar la función qsort (de stdlib) para ordenarlos.

2.- Ordenar en el mismo fichero, usando tu propia implementación de quicksort. Es mas aquí encontré un pequeño ejemplo.
  #3 (permalink)  
Antiguo 28/04/2010, 05:09
 
Fecha de Ingreso: febrero-2010
Mensajes: 258
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: eliminar un registro en C

En este mismo ejercicio me pide actualizar el tiempo de un ciclista y me funciona, pero cuando le pido mostrar por pantalla el fichero con la actualización del tiempo en lugar de eso me sale el menu. No lo entiendo.

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

Etiquetas: eliminar, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:21.