Stringstream escritura () problema, mientras que “sobrescribir”
-
27-09-2019 - |
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?
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.