Pregunta

Actualmente, tengo una llamada stringstream Data. Estoy buscando al comienzo de la stringstream mediante el uso de:

Data.seekp(0, std::ios::beg);

Entonces, trato de escribir 2 enteros a los primeros 8 bytes de la stringstream (anteriormente, los primeros 8 bytes se establecen en 0)

Data.write(reinterpret_cast<char*>(&dataLength),sizeof(int));
Data.write(reinterpret_cast<char*>(&dataFlags),sizeof(int));

Uso de la Visual C ++ depurador y cuando me puse un punto de interrupción, puedo ver que dataLength es igual a 12, y dataFlags es igual a 0, por lo que por lo tanto debería estar escribiendo 12 y 0 respectivamente.

Después de escribir los números enteros 2, que parecía tener ningún efecto. luego imprimo mis datos stringstream usando el siguiente código:

char* b = const_cast<char*>(Data.str().c_str());  
for (int i = 0; i < dataLength; i++)  
{  
    printf("%02X ",(unsigned char)b[i]);  
}

Me puede ver que los primeros 8 bytes de mis datos son todavía de 0 a pesar de que acaba de sobreescribí los primeros 12 bytes con dos números enteros (donde el primer entero! = 0).

¿Por qué no los datos de mi stringstream que se sobrescribe correctamente?

¿Fue útil?

Solución

char* b = const_cast<char*>(Data.str().c_str());

Data.str () es una temporal, que se destruye al final de esta declaración; el valor de esa temporales de c_str () sólo se puede utilizar mientras que el temporal está vivo (y usted ha hecho ninguna modificación a la misma, las normas de invalidación complejas para std :: string). Nunca se puede utilizar sin b comportamiento indefinido.

std::string b = Data.str();
for (int i = 0; i < b.size(); i++) {  
  printf("%02X ", (unsigned char) b[i]);  
}

Otros consejos

supongo que realmente quiere escribir la cadena "12" en el stringstream. No se puede convertir el int 12 a un char* simplemente echando la int a char*. Es decir, creo que esta parte de su podría ser incorrecta:

reinterpret_cast<char*>(&dataLength)

Si dataLength es realmente un int, esta no es la forma correcta de convertirlo en un char*. Tal vez esto:

Data << dataLength << dataFlags;

Espero no tengo mal entendido totalmente lo que estamos tratando de lograr.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top