Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Makum en 13 Junio 2010, 18:50 pm



Título: Ayuda principiante! :(
Publicado por: Makum en 13 Junio 2010, 18:50 pm
estoy con un proyecto en el que me juego el año y se me da realmente mal...
tengo que crear ficheros con datos, crear una ruta, que la crea pero a la hora de comparar si el codigo de la ruta existe o no...no funciona. En fin, lo dejo aqui:
agradezco de antemano cualquier ayuda  :-*

la estructura es la siguiente:

struct rutas
 {
   int codruta;
   char cadorigen[20];
   char caddestino[20];
   float distancia;
};
  typedef struct rutas trut;

y la funcion: no se como ponerlo y ya estoy quemadisima...


void datos_ruta ()   
{
    int cod;
    int condicion=0;
    trut rutas;
    FILE *pfich;
   
  printf ("Introduzca el codigo de la ruta:");
  scanf ("%d",&cod);
  pfich=fopen("c:\\rutas.dat","ab+");
      if (pfich == NULL)
      {
        printf ("Se ha producido un error. Imposible abrir el fichero.");
        exit(1);
      }
      else
      {
          fread(&rutas,sizeof(trut),1,pfich);
          while (condicion == 0)
          {
             if (cod == rutas.codruta)
             {
               
                printf ("El código introducido ya existe.");                                       
           
                printf ("Por favor, introduzca un código diferente:");
                scanf ("%d",&cod);
                fseek(pfich,0,0);
                condicion=0;
           
             }
             else
             {
               
                 printf ("INTRODUZCA:\n\n");
                 printf ("*Origen del viaje:");
                 scanf ("%s",&rutas.cadorigen);
                 printf ("*Destino del viaje:");
                 scanf ("%s",&rutas.caddestino);
                 printf ("*Distancia a recorrer:");
                 scanf ("%f",&rutas.distancia);
                 condicion=1;   
             }
             
             system ("cls");
             printf ("*La ruta ha sido creada correctamente*");
             
             getch ();
          } 
           fwrite (&rutas, sizeof(trut),1,pfich);
         }
  fclose(pfich);
}


Título: Re: Ayuda principiante! :(
Publicado por: Gallu en 14 Junio 2010, 10:33 am
Una cosa , el fichero rutas.dat solo contiene un registro? por que solo lees el primero de todos , por consiguiente aunque exitan más solamente compararás el dato introducido con el primer registro , estaría bien saber la estructura del fichero antes ...


Solución posible : cargar todos lo codigos de ruta en un array , y cuando metan el código mirar si existe o no , si no , llamar a la rutina de
grabación de registros , si existe mandar el mensaje indicandolo ... espero que te sirva

Prueba los siguiente , ya verás lo bien que va

Código
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define NOMBRE_ARCHI "c:\\rutas.dat"
  5. #define LIMPIA_BUFFER while(getchar()!='\n')
  6.  
  7.  
  8. struct rutas {
  9.   int codruta;
  10.   char cadorigen[20];
  11.   char caddestino[20];
  12.   float distancia;
  13. };
  14.  typedef struct rutas trut;
  15.  
  16.  
  17. void writeRuta();
  18. void datos_ruta () ;
  19. void imprimeRuta();
  20. void imprimeRutas();
  21. void leer_registro();
  22. void selectOpcio();
  23.  
  24. int main(){
  25. selectOpcio();
  26. }
  27.  
  28. void selectOpcio(){
  29. int opcio = 0;
  30. while(opcio !=3){
  31. printf("\nTeclee 1 para mostrar todos los registros ");
  32. printf("\nTeclee 2 para agregar uno nuevo ");
  33. printf("\nTeclee 3 para salir ");
  34. printf("\nOpcio :");
  35. scanf("%d",&opcio);
  36. LIMPIA_BUFFER;
  37. if(opcio == 1){
  38. leer_registro();
  39. }else if(opcio == 2){
  40. datos_ruta();
  41. }else if(opcio != 3){
  42. printf("\nOpcion invalida !!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
  43. }
  44. }
  45. }
  46. int compara_cod(int cod_buscado){
  47. FILE *pfich;
  48. trut ruta;
  49.  
  50. pfich = fopen(NOMBRE_ARCHI, "ab+");
  51.  
  52. fread(&ruta,sizeof(trut),1,pfich);
  53. while(!feof(pfich)){
  54. if(cod_buscado == ruta.codruta){
  55. return 1; //encontrado
  56. }
  57. fread(&ruta,sizeof(trut),1,pfich);
  58. }
  59. fclose(pfich);
  60. return 0;
  61. }
  62.  
  63.  
  64. void leer_registro(){
  65. FILE *pfich;
  66. trut ruta;
  67. int reg_leidos = 0;
  68.  
  69. pfich = fopen(NOMBRE_ARCHI, "ab+");
  70.  
  71. fread(&ruta,sizeof(trut),1,pfich);
  72. while(!feof(pfich)){
  73. imprimeRuta(ruta);
  74. fread(&ruta,sizeof(trut),1,pfich);
  75. reg_leidos++;
  76. }
  77. printf("\n\n Numero de registros leidos =%d \n\n",reg_leidos);
  78. fclose(pfich);
  79. }
  80.  
  81.  
  82. void imprimeRutas(trut ruta[], int size){
  83. int cont = 0;
  84. for(cont ; cont < size ; cont++){
  85. imprimeRuta(ruta[cont]);
  86. }
  87. }
  88. void imprimeRuta(trut ruta){
  89. printf("\n Cod:%d Origen:%s  Destino:%s  Distancia:%f",ruta.codruta, ruta.cadorigen , ruta.caddestino, ruta.distancia);
  90. }
  91. void writeRuta(){
  92. trut rutas[2] ;
  93. FILE *fichero ;
  94. int cont = 0 ;
  95.  
  96. rutas[0].codruta = 10;
  97. strcpy(rutas[0].cadorigen , "Barcelona");
  98. strcpy(rutas[0].caddestino , "Madrid");
  99. rutas[0].distancia = 500;
  100.  
  101. rutas[1].codruta = 20;
  102. strcpy(rutas[1].cadorigen , "Murcia");
  103. strcpy(rutas[1].caddestino , "Sevilla");
  104. rutas[1].distancia = 200;
  105.  
  106. fichero = fopen(NOMBRE_ARCHI ,"ab+");
  107.  
  108. fwrite(rutas, sizeof(rutas[cont]), 2, fichero );
  109. fclose(fichero);
  110.  
  111. }
  112.  
  113.  
  114. void datos_ruta () {
  115.    int cod = 0;
  116.    int condicion=0;
  117.    trut rutas;
  118.    FILE *pfich;
  119.  
  120.  printf ("Introduzca el codigo de la ruta:");
  121.  scanf ("%d",&cod);
  122.  LIMPIA_BUFFER; // importantísimo limpiar el buffer después de leer
  123.  pfich = fopen(NOMBRE_ARCHI,"ab+");
  124.      if (pfich == NULL) {
  125.        printf ("Se ha producido un error. Imposible abrir el fichero.");
  126.        return ;
  127.      }else{
  128.          while (condicion == 0){  
  129.             if (compara_cod(cod)) {   // en este punto llamamos a la rutina que compara los códigos            
  130.                printf ("El codigo introducido ya existe.");
  131.                printf ("Por favor, introduzca un codigo diferente:");
  132.                scanf ("%d",&cod);
  133. LIMPIA_BUFFER;
  134.                //fseek(pfich,0,0);    // ya no tiene caso situarse al principio
  135.                condicion=0;          
  136.             } else  {              
  137.                 printf ("INTRODUZCA:\n\n");
  138. rutas.codruta = cod;   //te faltaba esto para que se informe el número de codigo
  139.                 printf ("*Origen del viaje:");
  140.                 scanf ("%s",&rutas.cadorigen);
  141. LIMPIA_BUFFER;
  142.                 printf ("*Destino del viaje:");
  143.                 scanf ("%s",&rutas.caddestino);
  144. LIMPIA_BUFFER;
  145.                 printf ("*Distancia a recorrer:");
  146.                 scanf ("%f",&rutas.distancia);
  147. LIMPIA_BUFFER;
  148.                 condicion=1;  
  149. fwrite (&rutas, sizeof(rutas),1,pfich);
  150. system ("cls");
  151. printf ("*La ruta ha sido creada correctamente*");    
  152.             }
  153.          }          
  154. getch ();
  155.       }
  156.  fclose(pfich);
  157. }
  158.  
  159.  
  160.  
  161.