De fichero a Vector

Iniciado por chihue, 22 Diciembre 2014, 11:56 AM

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

chihue

Buenas tengo un vector y su estructura definido:

struct CIF{
int num;
char letra;
};

struct cliente{
int identificador;
CIF c;
string nombre;
string direccion;
string correo;
string ciudad;
};


y esta es mi funcion para leeerlos y psarlos a vector pero no me lo reconce


void FncLeerClientesFich(ifstream &f,VecClientes v, int &tam){
    int i = 0;
    string n;
int l = 0;
    while (!f.eof()) {
    getline(f,n);
        l++;
    }
    tam = l / 6;
    for (i=0; i<tam; i++){
    f >> v[i].identificador;
    f >> v[i].c.num >> v[i].c.letra;
    f >> v[i].nombre;
    f >> v[i].direccion;
    f >> v[i].correo;
    f >> v[i].ciudad;
}
}


El codigo que tiene que leer tiene esta estructura:
1012
24532333 X
La taberna vasca
Avda. Pio XII
taberna.vasca@hotmail.com
Valencia
1230
22345123 P
Cafes Valiente
Avda. Campanar
cafes.valiente@hotmail.com
Valencia
1455
20234561 T
Bier Winkeln
Avda. Campanar
Bier.Winklen@hotmail.com
Valencia
1875
12356355 R
Tapioca. Comidad para llevar.
Avda. Tres Forques
Tapioca@hotmail.com
Valencia

Orubatosu

A menos que no entienda exactamente que pretendes hacer...

Abres el fichero, y lees


    while (!f.eof()) {
     getline(f,n);
        l++;
    }


Es decir, cuando termines de leer todo el fichero, lo único que tienes en n es la última línea, y nada mas.
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

Yoel Alejandro

Hula chiue. Hay varios aspectos que tratar. En primer lugar, recuerda que la instrucción getline(f,n); lee una línea del fichero y la copia en el string "n", luego es el contenido de este string (y no del fichero "f") el que pasas a los campos de la estructura. Tambiés debes tener en cuenta (o al menos yo no pude dar con una manera más sencilla de hacerlo) que hay campos tipo "int", "char" y "string", por lo que debes hacer la conversión explícita de tipo según el caso:


v[i].identificador = atoi(n.c_str());
...
v[i].nombre = n;
...
v[i].direccion = n;


etc. Por último y muy importante lo que te recalcó Orubatosu, no puedes leer todo el fichero y luego copiar los valores a la estructura, pues en ese caso estarías pasando sólo los valores de la última línea del fichero. Debes leer línea por línea, y distinguir lo que se debe leer si es la primera línea, la segunda, la tercera, etc.

Para ello usamos el operador "%" de resto de la división entera. Analiza la estructura de este fichero con sus números de línea

1. ---| 1012 |---
2. 24532333 X
3. La taberna vasca
4. Avda. Pio XII
5. taberna.vasca@hotmail.com
6. Valencia
7. ---| 1230 |---
8. 22345123 P
9. Cafes Valiente
10. Avda. Campanar
11. cafes.valiente@hotmail.com
12. Valencia
13. ---| 1455 |---
14. 20234561 T
15. Bier Winkeln
16. Avda. Campanar
17. Bier.Winklen@hotmail.com
18. Valencia


Aquellas lìneas con los Nros. 1., 7., 13., ..., o sea aquella cuyo resto de dividir por 6 sea 1, corresponden al identificador. Las líneas 2., 8., 14., etc, cuyo resto de dividir por 6 sea 2 corresponden al par "num-letra", y así sucesivamente. Ten en cuenta que esta línea Nro. 2 en particular debe ser dividida en dos sub-strings para extraer el número (tipo num*) y la letra (tipo (char)).

Finalmente, no veo definido el tipo de dato "VecClientes", pero supongo que es un arreglo de struct cliente. Aquí el código de mi propuesta:

Código (cpp) [Seleccionar]

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct CIF {
   int num;
   char letra;
};

struct cliente {
   int identificador;
   CIF c;
   string nombre;
   string direccion;
   string correo;
   string ciudad;
};
typedef struct cliente * VecClientes;   /* <--- Yo puse esto */

void FncLeerClientesFich(ifstream &f,VecClientes v, int &tam);


int main ()
{
   string cadena;
   ifstream f("datos1.txt");
   struct cliente v[100];
   int tam;

   FncLeerClientesFich(f, v, tam);

   /* En este codigo de prueba vamos a imprimir los datos
    * que ha cargado del archivo
    */
   for ( int i = 0; i < tam; i++ ) {
      cout << v[i].identificador << endl;
      cout << v[i].c.num << " | " << v[i].c.letra << endl;
      cout << v[i].nombre << endl;
      cout << v[i].direccion << endl;
      cout << v[i].correo << endl;
      cout << v[i].ciudad << endl;
      cout << "------------------------" << endl;
   }

   f.close();

   return 0;
}

void FncLeerClientesFich(ifstream &f,VecClientes v, int &tam) {

   int i = 0;
   string n;
   string n1, n2; /* <-- esto es nuevo */
   int l = 0;
   while (!f.eof()) {
      getline(f,n);
      l++;

      /* 1ra linea */
      if ( l%6 == 1 )
         v[i].identificador = atoi(n.c_str());
      /* 2da linea */
      if ( l%6 == 2 ) {
         /* aqui dividimos el string en dos partes, por la cadena
          * separadora " "
          */
         size_t ind = n.find(" ");
         n1 = n.substr(0, ind);
         n2 = n.substr(ind + 1, n.length());
         v[i].c.num = atoi( n1.c_str() );
         v[i].c.letra = n2[0];
      }
      /* 3ra linea */
      if ( l%6 == 3 )
         v[i].nombre = n;
      /* 4ta linea */
      if ( l%6 == 4 )
         v[i].direccion = n;
      /* 5ta linea */
      if ( l%6 == 5 )
         v[i].correo = n;
      /* 6ta linea */
      if ( l%6 == 0 ) {
         v[i].ciudad = n;

         /* incrementa campo cada 6 lineas leidas del fichero */
         i++;
      }
   }
   tam = i;

   return;
}


y aquì puedes ver la salida del programa, donde le hice imprimir lo que ha leido del archivo:


1012
24532333 | X
La taberna vasca
Avda. Pio XII
taberna.vasca@hotmail.com
Valencia
------------------------
1230
22345123 | P
Cafes Valiente
Avda. Campanar
cafes.valiente@hotmail.com
Valencia
------------------------
1455
20234561 | T
Bier Winkeln
Avda. Campanar
Bier.Winklen@hotmail.com
Valencia
------------------------
1875
12356355 | R
Tapioca. Comidad para llevar.
Avda. Tres Forques
Tapioca@hotmail.com
Valencia


Por cierto, el fichero "datos1.txt" contiene la información que dices, de donde tomar los datos.

Enjoy it !!!
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)