Archivos .txt y estructuras c++

Iniciado por Ja_90, 3 Noviembre 2014, 22:00 PM

0 Miembros y 1 Visitante están viendo este tema.

Ja_90

Buenas tardes, me encuentro realizando una agenda de contactos con un menu que me permita anadir, ver contacto, editar, eliminar, salir.

Pues bien ya comence con la primera opcion que es anadir un contacto, y lo he guardado en un archivo de texto. Ahora quiero que al cerrar el programa y vuelva a entrar le pueda dar la opcion de ver contacto y que me lo muestre en pantalla.

Se que con la funcion ifstream puedo leer el archivo y comparando un string que le pida al usuario con el string que me idica el nombre para encontrarlo... pero, Como hago para que leea el archivo y me busque el contacto que le indique, y sobre todo que me lo muestre en pantalla??...

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>   // read and write outfile .txt
#include <cstring>
#include <cstdlib>   // To use system("clear")

using std::ofstream;  // write outfile .txt
using std::ifstream;  // read outfile .txt
using std::ios;
using std::cout;
using std::cin;
using std::endl;
using std::string;

const int LEN = 2;

void Addd(struct Data people[], int reg);  // add_contact_funtion

struct Data
{
   string Naame;
   unsigned int age;
};

int main()
{
   Data people[LEN];  //struct

   cout << endl;
   cout << "\t ////////  ////////  //        //  /////////  //////////  //////// " << endl;
   cout << "\t //        //    //  ////      //      //     //      //  //       " << endl;
   cout << "\t //        //    //  //  //    //      //     //      //  //       " << endl;
   cout << "\t //        //    //  //    //  //      //     //////////  //       " << endl;
   cout << "\t //        //    //  //      ////      //     //      //  //       " << endl;
   cout << "\t ////////  ////////  //        //      //     //      //  //////// " << endl;
   cout << endl;
   cout << "CONTACTS" << endl << endl;

   cout << "1. Add contact." << endl << endl;
   cout << "2. Show contact." << endl << endl;
   cout << "3. Exit" << endl << endl;

   int regi_ter = 0;

   int option;
   cout << "Numero de operacion a realizar: ";
   cin >> option;
   cin.ignore();
   cout << endl;

   switch (option)
   {
      case 1:
      system("clear");
      Addd(people,regi_ter);
      break;

      case 2:
         cout << "Show contact";
      break;

      case 3:
         cout << "EXIT";
         exit(0);
      break;

      default:
      cout << "Operation invalid.";
      system("clear");
      main();
      break;
   }

   return 0;
}

/// ADD_CONTACT_FUNTION ///

void Addd(struct Data people[], int reg)
{
   cout << "Write the contact information.";
   cout << endl << endl;
   cout << "1. Name: ";
   getline(cin,people[reg].Naame);
   cout << endl;
   cout << "6. Age: ";
   cin >> people[reg].age;
   cin.ignore();
   cout << endl;

   char sn[5];

   do
   {
      cout << "Add contact in the agenda? [S/N]: ";
      cin >> sn;

      if((strcmp(sn,"s")==0)||(strcmp(sn,"S")==0))
      {
         ofstream archivo;
         archivo.open("ContactsAgenda.txt", ios::app);
         archivo << "Name: " << people[reg].Naame << endl;
         archivo << "Age: " << people[reg].age << endl;
         archivo << endl << "---------------------------------------------" << endl << endl;
         archivo.close();

         reg++;

         cout << endl << "Contacto anadido." << endl;

         system("clear");
         main();
      }

      if((strcmp(sn,"n")==0)||(strcmp(sn,"N")==0))
      {
         cout << endl << "Contacto no anadido." << endl;

         system("clear");
         main();
      }
   }while ((sn!="S")||(sn!="s")||(sn!="N")||(sn!="n"));
}


Muchas gracias....Espero que me puedan entender.

PD: Quiero hacerlo sin punteros,  clases o vectores... Luego la pienso hacer de esa manera, por ahora solo con estructuras.
:D  ::::Ja_90::::   :D

Flakito81

#1
Por aquello de simplificar el trabajo yo guardaria todo en una sola linea
Código (cpp) [Seleccionar]

archivo << people[reg].Naame << ":"  people[reg].age <<  endl;


Si vas a leer el el archivo desde tu aplicacion creo que puedes prescindir de poner 'name', 'age' y otra información. Simplemente conoces el formato en el que se guarda la informacion y en tu aplicacion ya le pones la etiqueta/ nota que consideres.

Para lo que pides simplemente abres el archivo en modo lectura, lo recorres y ayudandote de getline lees la linea entera te quedas con la primera parte (lo que queda antes del ' :' <dos puntos> ) y lo comparas con lo que busques, si es inguar lo muestras y en otro caso sigues recorriendo hasta final de fichero.

Otra opción es que guardes la la estructura (modo binario)  y no los campos de la misma en modo texto. Para eso usas el método write. Obviamente luego recorres el fichero en modo lectura y leyendo con el médodo read. La comparacion es trivial.

Otras observaciones. Yo que tú evitaría tanta llamada recursiva a main siemplemente modifica el switch en el caso 3 y pones algo como: salir = true; y en codigo del main (debajo del Data people[LEN];  //struct ) pones unbool salir = false; do { // todo tu codigo hasta antes del return } while(salir == false);.
En la funcion Addd tambien quitaria las llamadas a main solo tienes que modificar el do-while te quedaria algo como:
Código (cpp) [Seleccionar]

}while ((sn!="N")||(sn!="n"));


Un saludo

Ja_90

Muchas gracias Flakito81  , probe lo de el bool salir = true en el do..while... funciono perfecto.

Estoy viendo como como leer el archivo hasta que encuentre un simbolo determinado por ejemplo un punto (.) para que me leea la informacion del contacto, ya que quiero agregar informacion a la estructura y en un solo renglon no queda bien.

Quedaria algo asi: Leer el archivo hasta el punto y que comprare el nombre con el introducido por el usuario, y si es igual que imprima esa informacion hasta el punto y si no que siga leyendo el archivo...
Pero no se de que manera implementarlo en el codigo, la sintaxis...  :huh:

Nombre: fulanito
edad: 24 años. <-----(.) aqui que lea el punto e imrpima si es igual al nombre introducido por el usuario o siga leyendo si es lo contrario.

Muchas Gracias seguire averiguando como hacerlo, algun consejo lo agradeceria.

:D  ::::Ja_90::::   :D