Stringstream write () problema durante “sovrascrivendo”
-
27-09-2019 - |
Domanda
Al momento, ho uno stringstream chiamato Data
. Sto cercando per l'inizio della stringstream utilizzando:
Data.seekp(0, std::ios::beg);
Poi, provo a scrivere 2 numeri interi per i primi 8 byte del stringstream (in precedenza, i primi 8 byte sono stati fissati a 0)
Data.write(reinterpret_cast<char*>(&dataLength),sizeof(int));
Data.write(reinterpret_cast<char*>(&dataFlags),sizeof(int));
Uso di Visual C ++ debugger e quando ho impostato un punto di interruzione, posso vedere che dataLength
è uguale a 12, e dataFlags
è uguale a 0, in modo quindi si dovrebbe scrivere 12 e 0 rispettivamente.
Dopo aver scritto i 2 numeri interi, sembrava avere alcun effetto. Ho quindi stampare i miei dati stringstream utilizzando il seguente codice:
char* b = const_cast<char*>(Data.str().c_str());
for (int i = 0; i < dataLength; i++)
{
printf("%02X ",(unsigned char)b[i]);
}
I può vedere che i primi 8 byte dei miei dati sono ancora 0 di anche se ho appena sovrascritto i primi 12 byte con due numeri interi (dove il primo numero intero! = 0).
Perché non i dati in mio stringstream sovrascrittura correttamente?
Soluzione
char* b = const_cast<char*>(Data.str().c_str());
Data.str () è una temporanea, che viene distrutto alla fine di questa affermazione; il valore di quella di temporanei c_str () può essere utilizzato solo quando la temporanea è vivo (e avete fatto alcuna modifica ad esso, le regole di invalidazione complesse per std :: string). Non si può mai usare B senza comportamento non definito.
std::string b = Data.str();
for (int i = 0; i < b.size(); i++) {
printf("%02X ", (unsigned char) b[i]);
}
Altri suggerimenti
presumo si vuole veramente scrivere la stringa "12
" nel stringstream. Non è possibile convertire il int
12
ad un char*
semplicemente gettando il int
a char*
. Cioè, credo che questa parte della vostra potrebbe essere non corretta:
reinterpret_cast<char*>(&dataLength)
Se dataLength è davvero un int, questo non è il modo corretto per trasformarlo in un char*
. Forse questo:
Data << dataLength << dataFlags;
Spero di non avere del tutto frainteso quello che stai cercando di raggiungere.