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++:
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <fstream>
  5.  
  6. struct datos
  7. {
  8.   char nombre[50];
  9.   int telefono;
  10.   char direccion[50];
  11.   char email[50];
  12.   int valido;       //valido=1->si existe        valido=0->no existe
  13.   int valido2;  //checara si el registro es correcto... siempre sera igual a 1706887114
  14. };
  15.  
  16. int menu()
  17. {
  18.   int n=0;
  19.   system("cls");
  20.   cout<<endl<<endl;
  21.   cout<<"                 ==========================================="<<endl;
  22.   cout<<"                 ||            AGENDA PERSONAL            ||"<<endl;
  23.   cout<<"                 ==========================================="<<endl;
  24.   cout<<"                 ||      1. AGREGAR NUEVO REGISTRO        ||"<<endl;
  25.   cout<<"                 ||      2. BUSCAR REGISTRO               ||"<<endl;
  26.   cout<<"                 ||      3. MOSTRAR TODOS LOS REGISTROS   ||"<<endl;
  27.   cout<<"                 ||      4. SALIR                         ||"<<endl;
  28.   cout<<"                 ==========================================="<<endl<<endl;
  29.   while ((n<1) || (n>4))
  30.     { cout<<"          Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>n; }
  31.   cout<<endl;
  32.   return n;
  33. }
  34.  
  35. void agregar(struct datos d)
  36. {
  37.   char na='s';        //na=preguntar si kiere nuevo registro
  38.   while (na=='s')
  39.     {
  40.     char nn='x'//nn=verificacion para agregar el registro
  41.     system ("cls"); //borramos pantalla
  42.     //guardamos los datos temporalmente en el struct
  43.     cout<<"Nombre: "; cin>> d.nombre;
  44.     cout<<"Telefono: "; cin>> d.telefono;
  45.     cout<<"Direccion: "; cin>> d.direccion;
  46.     cout<<"Email: "; cin>> d.email; cout<<endl;
  47.     d.valido=1;   //decimos ke el registro si existe
  48.     d.valido2=1706887114; //con esto garantizamos ke es uno de nuestros registros
  49.  
  50.     //verificamos si kiere agregar el nuevo registro
  51.     while ((nn!='s') && (nn!='n'))
  52.       { cout<<endl<<"Deseas agregar el nuevo registro? [s-n]: "; cin>>nn; }
  53.  
  54.     //agregamos
  55.     if (nn=='s')
  56.       {
  57.        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
  58.        if(!reg)                         //si no se pudo abrir el archivo
  59.          { cout <<"No se puede abrir el fichero."; }
  60.        reg.seekp(0, ios::end); // Colocar el cursor al final del archivo
  61.        reg.write((char *) &d, sizeof(d))//escribimos el nuevo registro
  62.        reg.close()//cerramos el archivo
  63.        cout<<endl<<"Registro agregado exitosamente"<<endl;
  64.        system("pause");
  65.       }
  66.     else
  67.       {
  68.        //borramos los datos temporales del struct
  69.        strcpy(d.nombre,"");
  70.        d.telefono=0;
  71.        strcpy(d.direccion,"");
  72.        strcpy(d.email,"");
  73.        d.valido=0;
  74.        d.valido2=0;
  75.        cout<<endl<<"El Registro NO fue agregado"<<endl;
  76.        system("pause");
  77.       }
  78.     na='x';
  79.     while ((na!='s') && (na!='n'))
  80.       { cout<<endl<<endl<<"Deseas agregar un registro nuevo? [s-n]: "; cin>>na; } //la validacion se hace en el while inicial
  81.   }//endwhile
  82. }
  83.  
  84. void modificar(struct datos d, int nm)
  85. {
  86.    char nnm='x';
  87.    system ("cls"); //borramos pantalla
  88.    //guardamos los datos temporalmente en el struct
  89.    cout<<"Nombre: "; cin>> d.nombre;
  90.    cout<<"Telefono: "; cin>> d.telefono;
  91.    cout<<"Direccion: "; cin>> d.direccion;
  92.    cout<<"Email: "; cin>> d.email; cout<<endl;
  93.    d.valido=1; //decimos ke si existe
  94.    d.valido2=1706887114;
  95.  
  96.    //verificamos si kiere modificar el registro
  97.    while ((nnm!='s') && (nnm!='n'))
  98.      { cout<<endl<<"Deseas modificar este registro? [s-n]: "; cin>>nnm; }
  99.  
  100.    //agregamos
  101.    if (nnm=='s')
  102.      {
  103.       ofstream reg("registros.dat", ios::out | ios::binary); //activamos el archivo en modo de escritura  (creamos el objeto 'reg')
  104.       if(!reg)                         //si no se pudo abrir el archivo
  105.         { cout <<"No se puede abrir el fichero."; }
  106.       reg.seekp((nm-1)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro a modificar
  107.       reg.write((char *) &d, sizeof(d))//escribimos el nuevo registro
  108.       reg.close()//cerramos el archivo
  109.       cout<<endl<<"Registro modificado exitosamente"<<endl;
  110.      }
  111.    else
  112.      {
  113.       //borramos los datos temporales del struct
  114.       strcpy(d.nombre,"");
  115.       d.telefono=0;
  116.       strcpy(d.direccion,"");
  117.       strcpy(d.email,"");
  118.       d.valido=1;
  119.       d.valido2=0;
  120.       cout<<endl<<"El Registro NO fue modificado"<<endl;
  121.      }
  122.    system("pause");
  123. }
  124.  
  125. void eliminar(struct datos d, int ne)
  126. {
  127.    system ("cls"); //borramos pantalla
  128.    d.valido=0;   //modificamos "valid0" del struct para decir ke ese registro no sera tomado en cuenta
  129.    d.valido2=1706887114; //agregamos nuestra garantia de registro
  130.  
  131.    //ahora actualizamos el registro
  132.    ofstream reg("registros.dat", ios::out | ios::binary); //activamos el archivo en modo de escritura  (creamos el objeto 'reg')
  133.    if(!reg)                         //si no se pudo abrir el archivo
  134.       { cout <<"No se puede abrir el fichero."<<endl; system("pause");}
  135.    reg.seekp((ne-1)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro a modificar
  136.    reg.write((char *) &d, sizeof(d))//escribimos el nuevo registro
  137.    reg.close()//cerramos el archivo
  138.    cout<<endl<<"Registro eliminado"<<endl;
  139.    system("pause");
  140. }
  141.  
  142. void buscar(struct datos d)
  143. {
  144.   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
  145.   while (nb1<4)
  146.     {
  147.     if (nb1==2)
  148.       { modificar(d, nb); }
  149.     else
  150.       {
  151.        if (nb1==3)
  152.          { eliminar(d, nb); }
  153.       }
  154.     system("cls"); //borramos pantalla
  155.     int nb=-2;
  156.     while (nb<0)
  157.       { cout<<"Introduce el registro a buscar [0 para salir]: "; cin>>nb; }
  158.     if (nb!=0) //si kiere buskar...
  159.       {
  160.       ifstream reg("registros.dat", ios::in | ios::binary);      //activa el archivo en modo de lectura (creamos el objeto 'reg')
  161.       reg.seekg((nb-1)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro encontrado
  162.       reg.read((char *) &d, sizeof d);        //leemos el registro encontrado
  163.       //verificamos que el registro es correcto
  164.       if ((d.valido==1) && (d.valido2==1706887114))
  165.         {
  166.         cout<<endl<<endl<<"--------Registro encontrado--------"<<endl;
  167.         cout<<"Nombre: "<<d.nombre<<endl<<"Telefono: "<<d.telefono<<endl<<"Direccion: "<<d.direccion<<endl<<"Email: "<<d.email<<endl<<endl;
  168.         cout<<endl;    //imprimimos menu de opciones
  169.         cout<<"                 ================================"<<endl;
  170.         cout<<"                 ||          OPCIONES          ||"<<endl;
  171.         cout<<"                 ================================"<<endl;
  172.         cout<<"                 ||    1. NUEVA BUSQUEDA       ||"<<endl;
  173.         cout<<"                 ||    2. MODIFICAR REGISTRO   ||"<<endl;
  174.         cout<<"                 ||    3. ELIMINAR REGISTRO    ||"<<endl;
  175.         cout<<"                 ||    4. SALIR                ||"<<endl;
  176.         cout<<"                 ================================"<<endl<<endl;
  177.         nb1=0;
  178.         while ((nb1<1) || (nb1>4))
  179.           { cout<<"     Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>nb1; }
  180.         cout<<endl;
  181.         }//endif ((d.valido==1) && (d.valido2==1706887114))
  182.       else //si el registro encontrado no es correcto
  183.         {
  184.          cout<<endl<<"El registro buscado no existe"<<endl;
  185.          system("pause");
  186.          nb1=1;
  187.         }
  188.       }//endif (nb!=0)
  189.     else     //si ya se kiere salir
  190.       { nb1=4; } //igualamos la bandera a 4 para ke se salga
  191.     } //endwhile
  192. }
  193.  
  194. void mostrar(struct datos d)
  195. {
  196.   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
  197.   while (nb11<3)
  198.     {
  199.     if (nb11==1)
  200.       { modificar(d, nme); }
  201.     else
  202.       {
  203.        if (nb11==2)
  204.          { eliminar(d, nme); }
  205.       }
  206.     system("cls"); //borramos pantalla
  207.     ifstream reg("registros.dat", ios::in | ios::binary);      //activa el archivo en modo de lectura (creamos el objeto 'reg')
  208.     con=0;
  209.     bandera=0;
  210.     while (reg && !reg.eof())
  211.       {
  212.        reg.seekg((con)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro encontrado
  213.        reg.read((char *) &d, sizeof d);        //leemos el registro encontrado
  214.        con++; //incrementamos contador del registro
  215.        //verificamos que el registro es correcto
  216.        if ((d.valido==1) && (d.valido2==1706887114))
  217.          {
  218.          bandera=1;
  219.          cout<<endl<<"--------Registro "<<con<<"--------"<<endl;
  220.          cout<<"Nombre: "<<d.nombre<<endl<<"Telefono: "<<d.telefono<<endl<<"Direccion: "<<d.direccion<<endl<<"Email: "<<d.email<<endl<<endl;
  221.          }//endif
  222.       }//endwhile
  223.     if (bandera==1)
  224.      {
  225.       cout<<endl<<endl;    //imprimimos menu de opciones
  226.       cout<<"                 ================================"<<endl;
  227.       cout<<"                 ||          OPCIONES          ||"<<endl;
  228.       cout<<"                 ================================"<<endl;
  229.       cout<<"                 ||    1. MODIFICAR REGISTRO   ||"<<endl;
  230.       cout<<"                 ||    2. ELIMINAR REGISTRO    ||"<<endl;
  231.       cout<<"                 ||    3. SALIR                ||"<<endl;
  232.       cout<<"                 ================================"<<endl<<endl;
  233.       nb11=0;
  234.       //preguntamos por ke opcion kiere realizar
  235.       while ((nb11<1) || (nb11>3))
  236.         { cout<<"     Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>nb11; }
  237.       nme=0;
  238.       while ((nme<1) && (nb11<3))
  239.         { cout<<"     Introduce el numero del registro: "; cin>>nme; }
  240.      }//endif bandera=1
  241.     else
  242.       { cout<<"No existen registros!"<<endl; system("pause"); nb11=3;}
  243.     } //endwhile
  244. }
  245.  
  246. int main()
  247. {
  248.   struct datos d;
  249.   int x=0;
  250.   fstream ("registros.dat", ios::out | ios::in | ios::binary);   //creamos el archivo
  251.   int n=0,band=0;
  252.   while (band==0)
  253.     {
  254.      n=menu();
  255.      switch (n)
  256.        {
  257.         case 1: agregar(d); break;
  258.         case 2: buscar(d); break;
  259.         case 3: mostrar(d); break;
  260.         case 4: band=1; break;
  261.        }
  262.     }
  263.   system("PAUSE");
  264.   return 0;
  265. }


Espero y te sirva de algo :p saludos!