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 #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 "); 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 ); if(cod_buscado == ruta.codruta){ return 1; //encontrado } fread(&ruta ,sizeof(trut ),1,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 ); imprimeRuta(ruta); fread(&ruta ,sizeof(trut ),1,pfich ); reg_leidos++; } printf("\n\n Numero de registros leidos =%d \n\n",reg_leidos ); } 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 ); } void datos_ruta () { int cod = 0; int condicion=0; trut rutas; FILE *pfich; printf ("Introduzca el codigo de la ruta:"); 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:"); LIMPIA_BUFFER; //fseek(pfich,0,0); // ya no tiene caso situarse al principio condicion=0; } else { 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 ); printf ("*La ruta ha sido creada correctamente*"); } } } }
|