Ayuda principiante! :(

Iniciado por Makum, 13 Junio 2010, 18:50 PM

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

Makum

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);
}

Gallu

#1
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



#include <stdio.h>
#include <string.h>
#define NOMBRE_ARCHI "c:\\rutas.dat"
#define LIMPIA_BUFFER while(getchar()!='\n')


struct rutas {
   int codruta;
   char cadorigen[20];
   char caddestino[20];
   float distancia;
};
  typedef struct rutas trut;
 
 
void writeRuta();
void datos_ruta () ;
void imprimeRuta();
void imprimeRutas();
void leer_registro();
void selectOpcio();

int main(){
selectOpcio();
}

void selectOpcio(){
int opcio = 0;
while(opcio !=3){
printf("\nTeclee 1 para mostrar todos los registros ");
printf("\nTeclee 2 para agregar uno nuevo ");
printf("\nTeclee 3 para salir ");
printf("\nOpcio :");
scanf("%d",&opcio);
LIMPIA_BUFFER;
if(opcio == 1){
leer_registro();
}else if(opcio == 2){
datos_ruta();
}else if(opcio != 3){
printf("\nOpcion invalida !!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
}
}
}
int compara_cod(int cod_buscado){
FILE *pfich;
trut ruta;

pfich = fopen(NOMBRE_ARCHI, "ab+");

fread(&ruta,sizeof(trut),1,pfich);
while(!feof(pfich)){
if(cod_buscado == ruta.codruta){
return 1; //encontrado
}
fread(&ruta,sizeof(trut),1,pfich);
}
fclose(pfich);
return 0;
}


void leer_registro(){
FILE *pfich;
trut ruta;
int reg_leidos = 0;

pfich = fopen(NOMBRE_ARCHI, "ab+");

fread(&ruta,sizeof(trut),1,pfich);
while(!feof(pfich)){
imprimeRuta(ruta);
fread(&ruta,sizeof(trut),1,pfich);
reg_leidos++;
}
printf("\n\n Numero de registros leidos =%d \n\n",reg_leidos);
fclose(pfich);
}


void imprimeRutas(trut ruta[], int size){
int cont = 0;
for(cont ; cont < size ; cont++){
imprimeRuta(ruta[cont]);
}
}
void imprimeRuta(trut ruta){
printf("\n Cod:%d Origen:%s  Destino:%s  Distancia:%f",ruta.codruta, ruta.cadorigen , ruta.caddestino, ruta.distancia);
}
void writeRuta(){
trut rutas[2] ;
FILE *fichero ;
int cont = 0 ;

rutas[0].codruta = 10;
strcpy(rutas[0].cadorigen , "Barcelona");
strcpy(rutas[0].caddestino , "Madrid");
rutas[0].distancia = 500;

rutas[1].codruta = 20;
strcpy(rutas[1].cadorigen , "Murcia");
strcpy(rutas[1].caddestino , "Sevilla");
rutas[1].distancia = 200;

fichero = fopen(NOMBRE_ARCHI ,"ab+");

fwrite(rutas, sizeof(rutas[cont]), 2, fichero );
fclose(fichero);

}

 
void datos_ruta () {
    int cod = 0;
    int condicion=0;
    trut rutas;
    FILE *pfich;
   
  printf ("Introduzca el codigo de la ruta:");
  scanf ("%d",&cod);
  LIMPIA_BUFFER; // importantísimo limpiar el buffer después de leer
  pfich = fopen(NOMBRE_ARCHI,"ab+");
      if (pfich == NULL) {
        printf ("Se ha producido un error. Imposible abrir el fichero.");
        return ;
      }else{
          while (condicion == 0){    
             if (compara_cod(cod)) {   // en este punto llamamos a la rutina que compara los códigos             
                printf ("El codigo introducido ya existe.");
                printf ("Por favor, introduzca un codigo diferente:");
                scanf ("%d",&cod);
LIMPIA_BUFFER;
                //fseek(pfich,0,0);    // ya no tiene caso situarse al principio
                condicion=0;           
             } else  {               
                 printf ("INTRODUZCA:\n\n");
rutas.codruta = cod;   //te faltaba esto para que se informe el número de codigo
                 printf ("*Origen del viaje:");
                 scanf ("%s",&rutas.cadorigen);
LIMPIA_BUFFER;
                 printf ("*Destino del viaje:");
                 scanf ("%s",&rutas.caddestino);
LIMPIA_BUFFER;
                 printf ("*Distancia a recorrer:");
                 scanf ("%f",&rutas.distancia);
LIMPIA_BUFFER;
                 condicion=1;   
fwrite (&rutas, sizeof(rutas),1,pfich);
system ("cls");
printf ("*La ruta ha sido creada correctamente*");   
             }
          }          
getch ();
       }
  fclose(pfich);
}



Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.