Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: winroot en 16 Mayo 2010, 00:03 am



Título: error en runtime leyendo datos de un archivo binario c++
Publicado por: winroot en 16 Mayo 2010, 00:03 am
hola!

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4. using namespace std;
  5. struct tipoRegistro {
  6. string nombre;
  7. int edad;
  8. float altura;
  9. };
  10. int main()
  11. {
  12. tipoRegistro pepe;
  13.  
  14. ofstream fsalida("prueba.dat",ios::out | ios::binary);
  15. pepe.nombre="jose luis";
  16. pepe.edad = 32;
  17. pepe.altura = 1.78;
  18. fsalida.write(reinterpret_cast<char *>(&pepe),
  19. sizeof(tipoRegistro));
  20. fsalida.close();
  21. return 0;
  22. }
  23.  
el problema, es que quiero leer los datos desde otro programa:
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4. using namespace std;
  5. struct tipoRegistro {
  6. string nombre;
  7. int edad;
  8. float altura;
  9. };
  10. int main()
  11. {
  12. tipoRegistro pepe;
  13. ifstream fentrada("prueba.dat",
  14. ios::in | ios::binary);
  15. fentrada.read(reinterpret_cast<char *>(&pepe),
  16. sizeof(tipoRegistro));
  17. cout <<pepe.nombre <<endl;
  18. cout << pepe.edad << endl;
  19. cout << pepe.altura << endl;
  20. fentrada.close();
  21. cin.get();
  22. return 0;
  23. }
  24.  
el problema es en este último programa, el  encargado de leer los datos del archivo prueva.dat.
compila perfecto, pero el error es en runtime.
nose   exactamente que es lo que esta mal, ya que el programa tira unos beeps, algo de las variables de entorno programfiles y esas cosas y se  cierra.

provado en dev c++ y en  CodeBlocks , dando exactamente el mismo resultado, probablemente porque los dos ides  usen el gcc.

porqué si uso todo en un mismo programa, pero quiero separar en un programa que lea los datos y otro que los escriba pasa esto?
el problema, es que si pongo todo en un mismo programa, no estaría leyendo los datos del fichero en si, ya que estarían ya cargados en ram.
me refiero a esto:
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstring>
  4. using namespace std;
  5. struct tipoRegistro {
  6. string nombre;
  7. int edad;
  8. float altura;
  9. };
  10. int main()
  11. {
  12. tipoRegistro pepe;
  13.  
  14. ofstream fsalida("prueba.dat",ios::out | ios::binary);
  15. pepe.nombre="jose luis";
  16. pepe.edad = 32;
  17. pepe.altura = 1.78;
  18. fsalida.write(reinterpret_cast<char *>(&pepe),
  19. sizeof(tipoRegistro));
  20. fsalida.close();
  21. ifstream fentrada("prueba.dat",
  22. ios::in | ios::binary);
  23. fentrada.read(reinterpret_cast<char *>(&pepe),
  24. sizeof(tipoRegistro));
  25. cout <<pepe.nombre <<endl;
  26. cout << pepe.edad << endl;
  27. cout << pepe.altura << endl;
  28. fentrada.close();
  29. cin.get();
  30. return 0;
  31. }
  32.  
así funciona perfecto, pero hacer esto no   tiene  ninguna utilidad.

bueno, gracias por su  tiempo y disculpen las molestias.
un saludo!   


Título: Re: error en runtime leyendo datos de un archivo binario c++
Publicado por: Littlehorse en 16 Mayo 2010, 01:05 am
El problema es un string es un objeto dinámico, guardar sus bits en un archivo y volver a leerlos no sirve de nada. El manejo de memoria no garantiza que los datos van a estar reservados exactamente en los mismos lugares.

El modo binario debe usarse con precaución y siempre desarrollando funciones que se encarguen de trabajar una estructura/archivo en especifico, en pos que las distintas ejecuciones no sean un problema (Como una forma de guardar/leer estándar para tu programa).

No lo puedo compilar ahora, pero prueba quitando el cout de "nombre" y probablemente el error desaparezca debido a lo antes mencionado.


Título: Re: error en runtime leyendo datos de un archivo binario c++
Publicado por: winroot en 16 Mayo 2010, 01:29 am
El problema es un string es un objeto dinámico, guardar sus bits en un archivo y volver a leerlos no sirve de nada. El manejo de memoria no garantiza que los datos van a estar reservados exactamente en los mismos lugares.

El modo binario debe usarse con precaución y siempre desarrollando funciones que se encarguen de trabajar una estructura/archivo en especifico, en pos que las distintas ejecuciones no sean un problema (Como una forma de guardar/leer estándar para tu programa).

No lo puedo compilar ahora, pero prueba quitando el cout de "nombre" y probablemente el error desaparezca debido a lo antes mencionado.
gracias por tu ayuda, mañana lo pruevo y te cuento.
ahora en donde estoy se me hace  imposible compilar.
saludos y gracias!