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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top