Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: alpachino98 en 16 Enero 2017, 11:03 AM

Título: Ayuda ficheros de c++
Publicado por: alpachino98 en 16 Enero 2017, 11:03 AM
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 (http://foro.elhacker.net/reglas.htm)
-Engel Lex
Título: Re: Ayuda ficheros de c++
Publicado por: francosmp en 17 Enero 2017, 03:04 AM
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