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
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 (c) [Seleccionar]
#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);
}