Hola amigos.
Este programa que les presento es una Agenda que me tocó hacer como proyecto final en la tercer parcial del segundo semestre en la Facultad de Telemática en la Ucol y pues si funciona bien 
Esta Agenda maneja archivos de acceso aleatorio en C++ y tiene la opción de agregar registros, modificar registros, eliminar registros y realizar busquedas.
Está muy completo 
Este es un screenshot de como se ve el programa en tiempo de ejecución:

y he aquí el código:
C++:
-
#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 ke el registro si existe
-
d.valido2=1706887114; //con esto garantizamos ke 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 ke 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 ke 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 ke 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 ke 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 ke 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())
-
{
-
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 ke 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;
-
}
Espero y te sirva de algo :p saludos!