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