(SOLUCIONADO)Como creo un array bidimensional de strings¿?no encuentro solucion

Iniciado por amrotz, 21 Marzo 2013, 04:34 AM

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

amrotz

Hola, estoy aprendiendo C++ con algunos tutoriales descargados de internet, despues de leer unas cuantas lecciones me decidi experimentar un poco con lo aprendido y me puse a programar una agenda.

He conseguido crearla y que funcione, pero tengo un dilema, me gustaria no limitarme al numero de datos introducidos por "usuario", para ello estaba pensando en hacer un array en el que el primer indice sea el numero de "usuario" y el segundo indice indique los datos de este.
Una cosa asi.

Usuario[0][0] = Nombre   Usuario[0][1] = telefono ...etc
Usuario[1][0] = Nombre   Usuario[1][1] = telefono ...etc

pero no logro hacerlo, no se como crear un array asi, ya que como se tratan de strings me da error.

Os pongo el codigo del "programa" que me imagino que se me entendera mejor.


#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include <cstdlib>
using namespace std;

int main(){


/**********DECLARACION VARIABLES***************/
     
     string nombre;
     string telefono;
     string direccion;
     string notas;
     
     vector <string> vnombre;
     vector <string> vtelefono;
     vector <string> vdireccion;
     vector <string> vnotas;
     
     
     string resp;
     string seguir="si";
     
     ifstream agenda_leer;
     ofstream agenda;
     
     string linea;
     vector <string> vline;
     
     int n=0;
     
     
     
     
     
/******************ABRIR ARCHIVO DE REGISTRO PARA COPIAR DATOS**********/

     ifstream vnome_leer("registro.txt");
     while(getline(vnome_leer,linea))
           vline.push_back(linea);
           
     vnome_leer.close();
     
           
           
           
           
     for(int i=0;i<vline.size();i++){
         if (vline[i] == "usuario")
            {
             vnombre.push_back(vline[i+1]);
             vtelefono.push_back(vline[(i+2)]);
             vdireccion.push_back(vline[(i+3)]);
             vnotas.push_back(vline[(i+4)]);
             n++;
             }
         }
         
 /*........EL CODIGO SIGUE, PERO NO CREO QUE HAGA FALTA QUE PONGA TODO*/
                   

El problema es que, si por ejemplo, quiero dar opcion a poner 2º telefono, o cualquier otro dato extra, tendria que incluirlo en el codigo, si pudiera hacer un array en el que el primer indice identifique cada "usuario" o persona o como se le quiera llamar, y el segundo indice identifique los datos que contiene ese "usuario", podria hacer el programa bastante mas practico.Pero no consigo hacerlo de ninguna manera.

Aclaro que como estoy aprendiendo , no quiero meterme en cosas que no sean standar, ya que los "atajos" ya tendre tiempo de mirarlos cuando haya aprendido lo suficiente.

Un saludo.

amchacon

Te has planteado hacer una estructura tal que así:

Código (cpp) [Seleccionar]
struct datos
{
      string nombre;
      string telefono;
      string direccion;
      string notas;
};


Haces un array de esa estructura y listo.

Si le quieres añadir más tarde datos extra, se los puedes añadir sin modificar el codigo apenas. Podrías incluso poner array de strings dentro...
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

amrotz

La estructura no me vale para mi proposito, ya que lo que intentaba hacer es que el propio usuario fuera quien decidiera cuantos datos tiene cada contacto.
He conseguido hacerlo, tube que poner el tamaño del array pero bueno, me vale bien.

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<cstring>
#include <cstdlib>
using namespace std;

int main(){


/**********DECLARACION VARIABLES***************/
     
      string nombre;
      string telefono;
      string direccion;
      string notas;
     
     
     
      string resp;
      string seguir="si";
     
      ifstream agenda_leer;
      ofstream agenda;
     
      string linea;
      vector <string> vline;
     
      int n=0;
     
      int cols=0;
      int fils=0;
     
      string user[100][10];
     
     
     
     
     
/******************ABRIR ARCHIVO DE REGISTRO PARA COPIAR DATOS**********/

      ifstream vnome_leer("registro.txt");
      while(getline(vnome_leer,linea))
            vline.push_back(linea);
           
      vnome_leer.close();
     
     
     
      for(int i=0;i<vline.size();i++){
          if (vline[i] == "usuario")
             {
             int I = (i+1);
             fils=0;
                    do{
                       
                       user[cols][fils]=vline[I];
                       fils++;
                       I++;
                    }while (vline[I]!="####################################");
              cols++;
              }
           }..........


Ahora solo tengo que modificar el codigo para que los datos de cada contacto vallan despues del "nombre del dato" , y haciendole una pregunta al usuario de si quiere añadir mas datos,  en caso de que responda si, tendria que poner el nombre del dato y despues el dato, asi tanto el archivo de registro como el archivo de txt de la agenda, contendrian las variables de esta forma.

N seria el numero identificativo de cada contacto

user[N][0]= el nombre del dato
user[N][1]= lo que contiene ese dato
user[N][2]=el nombre del segundo dato
user[N][3]= lo que contiene el segundo dato

Creo que esto seria correcto, si no es asi les agracederia que me corrigierais.

Un saludo

amrotz

Bueno consegui hacer que funcione como queria, aun se puede pulir un poco para que se vea el codigo mas limpio, y todavía tendria que poner condicionales para que no se pueden incluir las dos cadenas de caracteres que tengo como puntos de inicio y fin del registro, pero funciona, y a menos que el usuario incluya algo tan raro como **************** o ######################## no da error ni resultados inesperados, al menos en lo que he probado yo.
Pongo el codigo aqui completo .

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<cstring>
#include <cstdlib>
using namespace std;

int main(){


/**********DECLARACION VARIABLES***************/
     
      string nombre;
      string apellidos;
      string telefono;
      string direccion;
     
      string resp;
      string seguir="si";
      string r;
     
      ifstream agenda_leer;
      ofstream agenda;
     
      string linea;
      vector <string> vline;
     
      int n=0;
      string dato[6];
     
      int cols=0;
      int filas=0;;
     
      int fils[cols];
      string user[100][10];
     
     
     
     
     
/******************ABRIR ARCHIVO DE REGISTRO PARA COPIAR DATOS**********/

      ifstream vnome_leer("registro2.txt");
      while(getline(vnome_leer,linea))
            vline.push_back(linea);
           
      vnome_leer.close();
     
     
     
      for(int i=0;i<vline.size();i++){
          if (vline[i] == "***********************")
             {
             int I = (i+1);
             filas=0;
                    do{
                       
                       user[cols][filas]=vline[I];
                       filas++;
                       I++;
                    }while (vline[I]!="##########################");
              fils[cols]=filas;
              cols++;
              }
           }
           
           
           cout<<endl;
           for(int i=0;i<cols;i++)
               {
                for(int I=0;I<fils[i];I++)
                    {
                     cout<<"user"<<user[i][I]<<endl;
                    }
                 cout<<"################"<<endl;
                }
       
                   
/***************ABRIR AGENDA Y COPIAR DATOS DE REGISTRO***********/

      agenda.open("agenda2.txt");
           
           
            for(int i=0;i<cols;i++)
                {
                 for(int I=0;I<fils[i];I++)
                    {
                     agenda<<"\n"<<user[i][I];
                     I++;
                     agenda<<user[i][I];
                     }
                agenda<<"\n\n##########################\n";
                 
                agenda.close();
                agenda.open("agenda2.txt", ios::app);
           
                }
               
      agenda.close();
     
/***************ABRIR ARCHIVO Y MOSTRARLO POR PANTALLA****************/

      agenda_leer.open("agenda2.txt");
      cout<<"\n\n AGENDA\n\n"<<endl;
     
      while(getline(agenda_leer,linea))
          cout<<linea<<endl;
     
      agenda_leer.close();
       
       
/*****************ESCRITURA ARCHIVO**********************************/
/********************************************************************/
     
   
      while (seguir[0]=='s' or seguir[0]=='S'){
       
     
         cout<<"\n Introduce un nuevo contacto "<<endl;
         
         
         resp="si";
         
         cout<<endl;
         cout<<" Nombre: ";
         cin.sync();
         getline (cin,nombre);
         cout<<endl;
         
         cout<<" Apellidos: ";
         cin.sync();
         getline(cin,apellidos);
         cout<<endl;
         
         cout<<" Telefono: ";
         cin.sync();
         getline(cin,telefono);
         cout<<endl;
         
         cout<<" Direccion: ";
         cin.sync();
         getline(cin,direccion);
         cout<<endl;
         
         n=0;
         r="si";
         
         while(r[0]=='s' or r[0]=='S')
               {
                cout<<" ¿Introducir algun dato mas? ";
                cin.sync();
                getline(cin,r);
                if (r=="s" or r=="s" or r=="si" or r=="Si"
                    or r=="SI" or r=="sI")
                   {
                    cout<<" Introduce el nombre del dato nuevo: ";
                    cin.sync();
                    getline(cin,dato[n]);
                   
                    cout<<endl;
                    cout<<" Introduce el dato nuevo"<<endl;
                    cout<<" "<<dato[n]<<": ";
                    n++;
                    cin.sync();
                    getline(cin,dato[n]);
                    cout<<endl;
                   
                    n++;
                   
                    }
                }
         
         cout<<" Nombre: "<<nombre<<endl
             <<" Apellidos: "<<apellidos<<endl
             <<" Telefono: "<<telefono<<endl
             <<" Direccion: "<<direccion<<endl;
         for (int i=0;i<n;i++)
              {
               cout<<" "<<dato[i]<<": ";
               i++;
               cout<<dato[i]<<endl;
              }
             
         cout<<"\n ¿Los datos son correctos? \n";
         cin.sync();
         getline(cin,resp);
         
         if (resp=="s" or resp=="s" or resp=="si" or resp=="Si"
              or resp=="SI" or resp=="sI"){
             
            filas=0;
            user[cols][filas]="Nombre: ";
            filas++;
            user[cols][filas]=nombre;
            filas++;
            user[cols][filas]="Apellidos: ";
            filas++;
            user[cols][filas]=apellidos;
            filas++;
            user[cols][filas]="Telefono: ";
            filas++;
            user[cols][filas]=telefono;
            filas++;
            user[cols][filas]="Direccion: ";
            filas++;
            user[cols][filas]=direccion;
            filas++;
            for (int i=0;i<n;i++)
                {
                 user[cols][filas]=dato[i]+": ";
                 filas++;
                 i++;
                 user[cols][filas]=dato[i];
                 filas++;
                }
                 
           
            fils[cols]=filas;
           
           
            cols++;
           
            cout<<"user"<<user[0][0]<<endl;
           
            agenda.open("agenda2.txt");
           
           
            for(int i=0;i<cols;i++)
                {
                 for(int I=0;I<fils[i];I++)
                    {
                     agenda<<"\n"<<user[i][I];
                     I++;
                     agenda<<user[i][I];
                     }
                agenda<<"\n\n##########################\n";
                 
                agenda.close();
                agenda.open("agenda2.txt", ios::app);
           
                }
               
             agenda.close();
     
           
            }
           
               
           
         
         agenda_leer.open("agenda2.txt");
         cout<<"\n\n AGENDA\n\n"<<endl;
         
         while(getline(agenda_leer,linea))
                cout<<linea<<endl;
         
         agenda_leer.close();
         
         
         
         cout<<"\n ¿Introducir algun otro contacto? \n";
         cin.sync();
         getline(cin,seguir);
         
         }
     
   
     
     
   
   
   
       
/*******************FIN ESCRITURA ARCHIVO******************************/
/**********************************************************************/
       
       
/**************Guardamos los valores del vector vnome************/
/********************en un archivo de texto***************************/
     
      ofstream vnome("registro2.txt");
     
       
        for(int i=0;i<cols;i++)
               {
                vnome<<"***********************\n";
                for(int I=0;I<fils[i];I++)
                    {
                     vnome<<user[i][I]<<endl;
                    }
                vnome<<"##########################\n";
                }
       
      vnome.close();
     
     
//Ponemos un comando para que haya que pulsar ENTER para salir
cout<<"\n Presione ENTER para salir\n";         
cin.get();
}