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:
#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;
}