error en runtime leyendo datos de un archivo binario c++

Iniciado por winroot, 16 Mayo 2010, 00:03 AM

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

winroot

hola!

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
struct tipoRegistro {
string nombre;
int edad;
float altura;
};
int main()
{
tipoRegistro pepe;

ofstream fsalida("prueba.dat",ios::out | ios::binary);
pepe.nombre="jose luis";
pepe.edad = 32;
pepe.altura = 1.78;
fsalida.write(reinterpret_cast<char *>(&pepe),
sizeof(tipoRegistro));
fsalida.close();
return 0;
}

el problema, es que quiero leer los datos desde otro programa:
Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
struct tipoRegistro {
string nombre;
int edad;
float altura;
};
int main()
{
tipoRegistro pepe;
ifstream fentrada("prueba.dat",
ios::in | ios::binary);
fentrada.read(reinterpret_cast<char *>(&pepe),
sizeof(tipoRegistro));
cout <<pepe.nombre <<endl;
cout << pepe.edad << endl;
cout << pepe.altura << endl;
fentrada.close();
cin.get();
return 0;
}

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 (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
struct tipoRegistro {
string nombre;
int edad;
float altura;
};
int main()
{
tipoRegistro pepe;

ofstream fsalida("prueba.dat",ios::out | ios::binary);
pepe.nombre="jose luis";
pepe.edad = 32;
pepe.altura = 1.78;
fsalida.write(reinterpret_cast<char *>(&pepe),
sizeof(tipoRegistro));
fsalida.close();
ifstream fentrada("prueba.dat",
ios::in | ios::binary);
fentrada.read(reinterpret_cast<char *>(&pepe),
sizeof(tipoRegistro));
cout <<pepe.nombre <<endl;
cout << pepe.edad << endl;
cout << pepe.altura << endl;
fentrada.close();
cin.get();
return 0;
}

así funciona perfecto, pero hacer esto no   tiene  ninguna utilidad.

bueno, gracias por su  tiempo y disculpen las molestias.
un saludo!   
Mi blog sobre programación y seguridad informática:
http://win-root.blogspot.com

Littlehorse

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.
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

winroot

Cita de: 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.
gracias por tu ayuda, mañana lo pruevo y te cuento.
ahora en donde estoy se me hace  imposible compilar.
saludos y gracias!
Mi blog sobre programación y seguridad informática:
http://win-root.blogspot.com