Ayuda ficheros de c++

Iniciado por alpachino98, 16 Enero 2017, 11:03 AM

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

alpachino98

Estoy haciendo el trabajo final de asignatura, tengo que crear una biblioteca. La primera función necesito que lea los usuarios de un fichero y los guarde como vectores, el problema es que la función para leer los usuarios se mete en un bucle infinito. Aquí les dejo el código:

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct fecha
{
int dia;
int mes;
int año;
};

struct usuario
{
int DNI;
string nombre;
string apellidos;
string direccion;
string ciudad;
int codigo_postal;
string email;
int telefono;
fecha nacimiento;
};

struct ubicacion
{
int pasillo;
int estanteria;
};

struct libros
{
string ISBN;
string titulo;
string autor;
ubicacion ubicacion;
int prestado;
int valoracion;
};

struct prestamos
{
int identificador;
string ISBN;
int DNI;
string entrega;
string devolucion;
};
  const int MAXUsuarios=5000;
  const int MAXLibros=1000;
  const int MAXPrestamos=10000;
  typedef usuario VUsuario [MAXUsuarios];
  typedef libros VLibros [MAXLibros];
  typedef prestamos VPrestamos [MAXPrestamos];
 
  void FncMenu (int&  ,int&);
  void FncLeerUsuarioFich (ifstream&, VUsuario&, int&);
  void FncLeerLibrosFich (ifstream&, VLibros, int&);
  void FcnLeerPrestamosFich (ifstream&, VPrestamos, int&);

int main ()
{

VUsuario vu;
VLibros vl;
int tam;
ifstream f_in;  
ofstream f_out;
usuario u;
int opcion,subopcion;
//string nombre;
//int tel;
do{
FncMenu(opcion, subopcion);
switch (opcion)
{
case 1:
{
f_in.open("usuarios.txt");
if(f_in.fail())
{ cout<<"Error abriendo fichero usuarios"<<endl; }
else
{ FncLeerUsuarioFich(f_in,vu,tam);
f_in.close();}
break;
}
case 2:
{
f_in.open("libros.txt");
if(f_in.fail())
{ cout<<"Error abriendo fichero usuarios"<<endl; }
else
{ FncLeerLibrosFich(f_in,vl,tam);
f_in.close();}
break;
}
}
}while (opcion !=0);
return 0;
}
void FncMenu ( int& opcion, int& subopcion)
{
do{
cout<<endl;
cout<<"----------MENU----------"<<endl;
cout<<"1.Leer datos de un fichero "<<endl;
cout<<"2.Dar alta"<<endl;
cout<<"3.Dar de baja a un usuario"<<endl;
cout<<"4.Mostrar informaci\242n"<<endl;
cout<<"5.Guardar informaci\242n actual de la biblioteca"<<endl;
cout<<"6.Buscar informaci\242n"<<endl;
cout<<"7.Mostrar en pantalla la informaci\242n"<<endl;
cout<<"8.Volcar informacion del informe"<<endl;
cout<<"0.Salir"<<endl;
cout<<"-------------------------------------------------"<<endl;
cin>>opcion;

switch (opcion)
{
case 2:cout<<"1.Dar alta usuario"<<endl;
cout<<"2.Dar alta libro"<<endl;
cout<<"3.Dar alta prestamo"<<endl;
cin>>subopcion;
break;
case 4 :cout<<"1.Mostrar informaci\242n de todos los usuarios"<<endl;
cout<<"2.Mostrar informaci\242n de todos los libro"<<endl;
cout<<"3.Mostrar informaci\242n prestamos"<<endl;
cin>>subopcion;
break;
case 6 :cout<<"1.Buscar la informaci\242n de un usuario"<<endl;
cout<<"2.Buscar informaci\242n de un libro"<<endl;
cout<<"3.Buscar informaci\242n de un prestamo"<<endl;
cin>>subopcion;
break;

}
}while (opcion<0 || opcion >8);

}
void FncLeerUsuarioFich(ifstream& f_in      , VUsuario& vu   , int&  tam   )
{
  while(!f_in.eof())
  {
     f_in>>vu[tam].DNI;
   getline(f_in,vu[tam].nombre);
getline(f_in,vu[tam].apellidos);
getline(f_in,vu[tam].direccion);
getline(f_in,vu[tam].ciudad);
f_in>>vu[tam].codigo_postal;
   getline(f_in,vu[tam].email);
   f_in>>vu[tam].telefono;
   f_in>>vu[tam].nacimiento.dia;
   f_in>>vu[tam].nacimiento.mes;
   f_in>>vu[tam].nacimiento.año;
  tam++;
  cout<<"leido";

  };
}

Si alguien me puede ayudar porfavor..... :-\


· Los códigos deben ir en etiquetas GeSHi
>Lee las reglas
-Engel Lex

francosmp

en tu funcion para leer veo que estas capturando un flujo que nose como estara delimitado, que yo sepa cuando usas un getline, solicitas la cadena completa hasta que acabe el flujo y el puntero de la libreria se situa en el siguiente registro, pero no veo que uses delimitadores. nose como trabajara pero anteriormente use fstream y no use delimitadores cuando trabajaba con archivos dat pero con otros como excel y txt si tuve que usarlos por su naturaleza. en la biblioteca stdlib sino me equivoco tambien levanta archivos de ese tipo pero tiene funcionalidad similar.creo que ese es tu problema, y te recomiendo que si vas a trabajar con ese tipo de estructuras trabajes con vectores dinamicos y bibliotecas extra para no estar definiendo estructuras como fecha y ubicacion.
Salu2