C/Visual C - problema con CString fstream

 
Vista:

problema con CString fstream

Publicado por Oliver++ (339 intervenciones) el 30/05/2003 14:17:51
el inconveniente es con el siguiente código

CString cadena1;
CString cadena2;
fstream archivo;
archivo.open ( "nombre", ios::in | ios::out | ios::binary );
cadena1 = "cualquier cadena";
archivo.write ( (char*) &cadena1, sizeof ( CString ) );
archivo.seekg ( 0 );
archivo.read ( (char*) &cadena2, sizeof (CString ) );
cout<< cadena2;

el contenido de cadena1 deberia ser copiado a cadena2 pero no es así.
cadena2 aparece vacío y no se imprime nada, no entiendo cual es la razón si con tipos de datos intrínsicos funciona bien (osea con tipos de datos definidos por el compilador).
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:problema con CString fstream

Publicado por chuidiang (677 intervenciones) el 30/05/2003 23:36:52
&cadena1 es la dirección de una instancia de la clase CString. No puedes hacer un cast alegremente a char *. Eso te funcionará o no dependiendo de cómo esté implementada por dentro CString.

sizeof(CString) te da el tamaño de la clase, no de la cadena. Es decir, si dentro de la clase está el string real (posiblemente un char *) y cuatro atributos más, te dará el tamaño del char * (4 bytes) más el de los cuatro atributos.

Si archivo.write() necesita un char * y la longitud de la cadena tendrás que llamar a funciones de CString para obtener esos datos.

Para convertir CString a un char *, debes hacerle un cast a LPCTSTR (a la clase, no al puntero).

Para la longitud, tienes CString::GetLength()

O sea, quedaría algo así como

archivo.write (LPCTSTRcadena1, cadena1.GetLength())

Para leer luego, tendrás que hacer cosas parecidas.

De todas formas, mira la Clase CArchve. Admite cosas como
CArchive << CString

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar