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:
#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 !!!