<div dir="ltr">Hola Alberto,<div class="gmail_extra"><br></div><div class="gmail_extra">El problema está en el parámetro que pasas a 'write()' y a 'read()'. Escribes:<br><br>fsalida.write(reinterpret_cast<char *>(&v1[i]),sizeof(v1[i]));</div><div class="gmail_extra"><br></div><div class="gmail_extra">Como explicas al final, la clase 'Persona' contiene tres objetos de tipo 'string'. He aquí el problema, porque copias toda la información en cada objeto 'string'. Sin embargo, no toda la información tiene que ver con los datos de la cadena de caracteres en sí. La clase 'string' representa una cadena dinámica de caracteres por lo que usará punteros y memoria dinámicamente adjudicada. Esto implica que no copias los caracteres de la cadena sino el puntero junto con cualesquier otros datos gestores del objeto (de la clase 'string').</div><div class="gmail_extra"><br></div><div class="gmail_extra">La solución es obtener los datos que quieres guardar. Seguramente necesites invocar 'write()' y 'read()' varias veces. Por ejemplo,</div><div class="gmail_extra"><br></div><div class="gmail_extra">fsalida.write( v1[i].GetNombre().c_str(), v1[i].GetNombre().length() );<br></div><div class="gmail_extra"><div class="gmail_extra">fsalida.write( v1[i].GetApellido1().c_str(), v1[i].GetApellido1().length() );</div><div><div>fsalida.write( v1[i].GetApellido2().c_str(), v1[i].GetApellido2().length() );</div></div><div><div>fsalida.write( reinterpret_cast<const char *>( &v1[i].GetEdad() ), sizeof v1[i].GetEdad() );</div></div><div><br></div><div>Lo mismo sucede con 'read()'. Debes leer cada campo individualmente y guardar los datos en su campo correspondiente. Sin embargo, surge otro problema especialmente con las cadenas de caracteres. Al tratarse de un fichero binario, la cantidad de caracteres es variable. Por lo tanto, nos conviene guardar la cantidad de caracteres dentro del fichero. Al final, haríamos esto:<br><br>string::size_type nLength = v1[i].GetNombre().length();<br><div>fsalida.write( reinterpret_cast<const char *>( &nLength ), sizeof nLength );</div><div>fsalida.write( v1[i].GetNombre().c_str(), nLength );</div><div><br></div><div>nLength = v1[i].GetApellido1().length();<br></div><div>fsalida.write( reinterpret_cast<const char *>( &nLength ), sizeof nLength );</div><div>fsalida.write( v1[i].GetApellido1().c_str(), nLength );<br></div><div><br></div><div>nLength = v1[i].GetApellido2().length();</div><div>fsalida.write( reinterpret_cast<const char *>( &nLength ), sizeof nLength );</div><div>fsalida.write( v1[i].GetApellido2().c_str(), nLength );<br></div><div><br></div><div>fsalida.write( reinterpret_cast<const char *>( &v1[i].GetEdad() ), sizeof v1[i].GetEdad() );</div></div><div><br></div><div>El formato ahora es:<br><br>[CANTIDAD_NOMBRE] [NOMBRE] [CANTIDAD_APELLIDO1] [APELLIDO1] [CANTIDAD_APELLIDO2] [APELLIDO2] [EDAD] ...</div></div><div class="gmail_extra"><br></div><div class="gmail_extra">Esto ayuda la lectura, porque podemos averiguar la cantidad de caracteres antes de leerlos y guardarlos en una cadena y así podemos hacer preparaciones.</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Espero que esto te ayude.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Steven<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">2015-07-06 5:06 GMT-04:00 Alberto <span dir="ltr"><<a href="mailto:tuit.alberto.sinc@gmail.com" target="_blank">tuit.alberto.sinc@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Buenas tardes.<br>
<br>
De antemano, decir que uso DEV-c++ version 4.9.9.2<br>
<br>
Llevo ya un tiempo peleandome con este problema, y al verdad ya no se por donde van los tiros. Primero les dejo el codigo y luego escribo la duda<br>
<br>
Persona P("Alberto","Tuit","Jara",25),P2;<br>
vector<Persona> v1(6);<br>
vector<Persona> v2(6);<br>
<br>
for (int i=0;i<v1.size();i++){<br>
 v1[i]=P;<br>
}<br>
<br>
 ofstream fsalida("BBDDPersona.dat", ios::out | ios::binary);<br>
<br>
for (int i=0;i<v1.size();i++){                                                     fsalida.write(reinterpret_cast<char *>(&v1[i]),sizeof(v1[i]));<br>
    }<br>
fsalida.close();<br>
<br>
ifstream fentrada("BBDDPersona.dat", ios::in | ios::binary);<br>
for (int i=0; i<v2.size();i++){<br>
                                                         fentrada.read(reinterpret_cast<char *>(&v2[i]), sizeof(v2[i]));<br>
   }<br>
<br>
for (int i=0; i<v2.size();i++){<br>
   cout << v2[i].GetNombre() << endl;<br>
   cout << v2[i].GetApellido1() << endl;<br>
   cout << v2[i].GetApellido2() << endl;                                                                      cout <<v2[i].GetEdad(<<endl;<br>
   cout<<endl;<br>
   }<br>
fentrada.close();<br>
<br>
Teniendo la clase Persona 4 campos 3 string "nombre apellido1 y apellido2"  y un int "Edad" y como funciones constructores setters y getters.<br>
<br>
Bueno, el problema está en que el programa crashea despues de la lectura, no se si es por un fallo de liberación de memoria o porque.<br>
<br>
Muchas gracias por su tiempo.<br>
Alberto tuit<br></blockquote></div></div></div>