Bueno tengo este codigo, y lo q pasa es q el final cuando estoy en el menu de mostrar datos, siempre me muesta el ultimo dato registrado dos veces, como si en la parte de agregar lo agregara dos veces.
este es el while ubicado casi al finalq repite el numero de veces al mostar y me muestra un valor mas. while (reg && !reg.eof()) tmb lo cambie por
while ( !reg.eof()) y me da lo mismo, gracias.
este es el while ubicado casi al finalq repite el numero de veces al mostar y me muestra un valor mas. while (reg && !reg.eof()) tmb lo cambie por
while ( !reg.eof()) y me da lo mismo, gracias.
Código [Seleccionar]
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
struct datos
{
char nombre[50];
int telefono;
char direccion[50];
char email[50];
int valido; //valido=1->si existe valido=0->no existe
int valido2; //checara si el registro es correcto... siempre sera igual a 1706887114
};
int menu()
{
int n=0;
system("cls");
cout<<endl<<endl;
cout<<" ==========================================="<<endl;
cout<<" || AGENDA PERSONAL ||"<<endl;
cout<<" ==========================================="<<endl;
cout<<" || 1. AGREGAR NUEVO REGISTRO ||"<<endl;
cout<<" || 2. BUSCAR REGISTRO ||"<<endl;
cout<<" || 3. MOSTRAR TODOS LOS REGISTROS ||"<<endl;
cout<<" || 4. SALIR ||"<<endl;
cout<<" ==========================================="<<endl<<endl;
while ((n<1) || (n>4))
{ cout<<" Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>n; }
cout<<endl;
return n;
}
void agregar(struct datos d)
{
char na='s'; //na=preguntar si kiere nuevo registro
while (na=='s')
{
char nn='x'; //nn=verificacion para agregar el registro
system ("cls"); //borramos pantalla
//guardamos los datos temporalmente en el struct
cout<<"Nombre: "; cin>> d.nombre;
cout<<"Telefono: "; cin>> d.telefono;
cout<<"Direccion: "; cin>> d.direccion;
cout<<"Email: "; cin>> d.email; cout<<endl;
d.valido=1; //decimos que el registro si existe
d.valido2=1706887114; //con esto garantizamos que es uno de nuestros registros
//verificamos si kiere agregar el nuevo registro
while ((nn!='s') && (nn!='n'))
{ cout<<endl<<"Deseas agregar el nuevo registro? [s-n]: "; cin>>nn; }
//agregamos
if (nn=='s')
{
ofstream reg("registros.dat", ios::app | ios::binary); //activamos el archivo en modo de escritura tomando en cuenta el parametro "app" para agregar en la ultima posicion del archivo
if(!reg) //si no se pudo abrir el archivo
{ cout <<"No se puede abrir el fichero."; }
reg.seekp(0, ios::end); // Colocar el cursor al final del archivo
reg.write((char *) &d, sizeof(d)); //escribimos el nuevo registro
reg.close(); //cerramos el archivo
cout<<endl<<"Registro agregado exitosamente"<<endl;
system("pause");
}
else
{
//borramos los datos temporales del struct
strcpy(d.nombre,"");
d.telefono=0;
strcpy(d.direccion,"");
strcpy(d.email,"");
d.valido=0;
d.valido2=0;
cout<<endl<<"El Registro NO fue agregado"<<endl;
system("pause");
}
na='x';
while ((na!='s') && (na!='n'))
{ cout<<endl<<endl<<"Deseas agregar un registro nuevo? [s-n]: "; cin>>na; } //la validacion se hace en el while inicial
}//endwhile
}
void modificar(struct datos d, int nm)
{
char nnm='x';
system ("cls"); //borramos pantalla
//guardamos los datos temporalmente en el struct
cout<<"Nombre: "; cin>> d.nombre;
cout<<"Telefono: "; cin>> d.telefono;
cout<<"Direccion: "; cin>> d.direccion;
cout<<"Email: "; cin>> d.email; cout<<endl;
d.valido=1; //decimos que si existe
d.valido2=1706887114;
//verificamos si kiere modificar el registro
while ((nnm!='s') && (nnm!='n'))
{ cout<<endl<<"Deseas modificar este registro? [s-n]: "; cin>>nnm; }
//agregamos
if (nnm=='s')
{
ofstream reg("registros.dat", ios::out | ios::binary); //activamos el archivo en modo de escritura (creamos el objeto 'reg')
if(!reg) //si no se pudo abrir el archivo
{ cout <<"No se puede abrir el fichero."; }
reg.seekp((nm-1)*sizeof(d)); //colocamos el apuntador en la posicion inicial del registro a modificar
reg.write((char *) &d, sizeof(d)); //escribimos el nuevo registro
reg.close(); //cerramos el archivo
cout<<endl<<"Registro modificado exitosamente"<<endl;
}
else
{
//borramos los datos temporales del struct
strcpy(d.nombre,"");
d.telefono=0;
strcpy(d.direccion,"");
strcpy(d.email,"");
d.valido=1;
d.valido2=0;
cout<<endl<<"El Registro NO fue modificado"<<endl;
}
system("pause");
}
void eliminar(struct datos d, int ne)
{
system ("cls"); //borramos pantalla
d.valido=0; //modificamos "valid0" del struct para decir que ese registro no sera tomado en cuenta
d.valido2=1706887114; //agregamos nuestra garantia de registro
//ahora actualizamos el registro
ofstream reg("registros.dat", ios::out | ios::binary); //activamos el archivo en modo de escritura (creamos el objeto 'reg')
if(!reg) //si no se pudo abrir el archivo
{ cout <<"No se puede abrir el fichero."<<endl; system("pause");}
reg.seekp((ne-1)*sizeof(d)); //colocamos el apuntador en la posicion inicial del registro a modificar
reg.write((char *) &d, sizeof(d)); //escribimos el nuevo registro
reg.close(); //cerramos el archivo
cout<<endl<<"Registro eliminado"<<endl;
system("pause");
}
void buscar(struct datos d)
{
int nb1=0, nb=-2; //nb1=variable auxiliar para saber si kiere volver a buskar o salir nb=variable que guarda el #de registro buskado
while (nb1<4)
{
if (nb1==2)
{ modificar(d, nb); }
else
{
if (nb1==3)
{ eliminar(d, nb); }
}
system("cls"); //borramos pantalla
int nb=-2;
while (nb<0)
{ cout<<"Introduce el registro a buscar [0 para salir]: "; cin>>nb; }
if (nb!=0) //si kiere buskar...
{
ifstream reg("registros.dat", ios::in | ios::binary); //activa el archivo en modo de lectura (creamos el objeto 'reg')
reg.seekg((nb-1)*sizeof(d)); //colocamos el apuntador en la posicion inicial del registro encontrado
reg.read((char *) &d, sizeof d); //leemos el registro encontrado
//verificamos que el registro es correcto
if ((d.valido==1) && (d.valido2==1706887114))
{
cout<<endl<<endl<<"--------Registro encontrado--------"<<endl;
cout<<"Nombre: "<<d.nombre<<endl<<"Telefono: "<<d.telefono<<endl<<"Direccion: "<<d.direccion<<endl<<"Email: "<<d.email<<endl<<endl;
cout<<endl; //imprimimos menu de opciones
cout<<" ================================"<<endl;
cout<<" || OPCIONES ||"<<endl;
cout<<" ================================"<<endl;
cout<<" || 1. NUEVA BUSQUEDA ||"<<endl;
cout<<" || 2. MODIFICAR REGISTRO ||"<<endl;
cout<<" || 3. ELIMINAR REGISTRO ||"<<endl;
cout<<" || 4. SALIR ||"<<endl;
cout<<" ================================"<<endl<<endl;
nb1=0;
while ((nb1<1) || (nb1>4))
{ cout<<" Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>nb1; }
cout<<endl;
}//endif ((d.valido==1) && (d.valido2==1706887114))
else //si el registro encontrado no es correcto
{
cout<<endl<<"El registro buscado no existe"<<endl;
system("pause");
nb1=1;
}
}//endif (nb!=0)
else //si ya se kiere salir
{ nb1=4; } //igualamos la bandera a 4 para que se salga
} //endwhile
}
void mostrar(struct datos d)
{
int nb11=0,con=0,nme=0,bandera=0; //nb1=variable auxiliar para saber si kiere volver a buskar o salir nb=variable que guarda el #de registro buskado
while (nb11<3)
{
if (nb11==1)
{ modificar(d, nme); }
else
{
if (nb11==2)
{ eliminar(d, nme); }
}
system("cls"); //borramos pantalla
ifstream reg("registros.dat", ios::in | ios::binary); //activa el archivo en modo de lectura (creamos el objeto 'reg')
con=0;
bandera=0;
while (reg && !reg.eof()) //aca el problema
{
reg.seekg((con)*sizeof(d)); //colocamos el apuntador en la posicion inicial del registro encontrado
reg.read((char *) &d, sizeof d); //leemos el registro encontrado
con++; //incrementamos contador del registro
//verificamos que el registro es correcto
if ((d.valido==1) && (d.valido2==1706887114))
{
bandera=1;
cout<<endl<<"--------Registro "<<con<<"--------"<<endl;
cout<<"Nombre: "<<d.nombre<<endl<<"Telefono: "<<d.telefono<<endl<<"Direccion: "<<d.direccion<<endl<<"Email: "<<d.email<<endl<<endl;
}//endif
}//endwhile
if (bandera==1)
{
cout<<endl<<endl; //imprimimos menu de opciones
cout<<" ================================"<<endl;
cout<<" || OPCIONES ||"<<endl;
cout<<" ================================"<<endl;
cout<<" || 1. MODIFICAR REGISTRO ||"<<endl;
cout<<" || 2. ELIMINAR REGISTRO ||"<<endl;
cout<<" || 3. SALIR ||"<<endl;
cout<<" ================================"<<endl<<endl;
nb11=0;
//preguntamos por que opcion kiere realizar
while ((nb11<1) || (nb11>3))
{ cout<<" Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>nb11; }
nme=0;
while ((nme<1) && (nb11<3))
{ cout<<" Introduce el numero del registro: "; cin>>nme; }
}//endif bandera=1
else
{ cout<<"No existen registros!"<<endl; system("pause"); nb11=3;}
} //endwhile
}
int main()
{
struct datos d;
int x=0;
fstream ("registros.dat", ios::out | ios::in | ios::binary); //creamos el archivo
int n=0,band=0;
while (band==0)
{
n=menu();
switch (n)
{
case 1: agregar(d); break;
case 2: buscar(d); break;
case 3: mostrar(d); break;
case 4: band=1; break;
}
}
system("PAUSE");
return 0;
}