Stringstream write () проблема при "перезаписи" - PullRequest
1 голос
/ 31 октября 2010

В настоящее время у меня есть поток строк с именем Data. Я ищу начало потока строк, используя:

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

Затем я пытаюсь записать 2 целых числа в первые 8 байтов потока строки (ранее первые 8 байтов были установлены в 0)

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

Используя отладчик Visual C ++, и когда я устанавливаю точку останова, я вижу, что dataLength равен 12, а dataFlags равен 0, поэтому он должен писать 12 и 0 соответственно.

После записи 2 целых чисел это, похоже, не дало эффекта. Затем я печатаю свои данные в виде строки, используя следующий код:

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

Я вижу, что первые 8 байтов моих данных по-прежнему равны 0, хотя я только что перезаписал первые 12 байтов двумя целыми числами (где первое целое число! = 0).

Почему данные в моем потоке строк не перезаписываются должным образом?

Ответы [ 2 ]

2 голосов
/ 31 октября 2010
char* b = const_cast<char*>(Data.str().c_str());

Data.str () является временным, который уничтожается в конце этого оператора;значение c_str () этого временного объекта можно использовать только тогда, когда временный объект активен (и вы не вносили в него никаких изменений, правила аннулирования сложны для std :: string).Вы никогда не можете использовать b без неопределенного поведения.

std::string b = Data.str();
for (int i = 0; i < b.size(); i++) {  
  printf("%02X ", (unsigned char) b[i]);  
}
0 голосов
/ 31 октября 2010

Полагаю, вы действительно хотите записать строку "12" в поток строк. Вы не можете преобразовать int 12 в char*, просто приведя int к char*. То есть, я считаю, что эта часть вашей может быть неправильной:

reinterpret_cast<char*>(&dataLength)

Если dataLength действительно является int, это не правильный способ превратить его в char*. Возможно это:

Data << dataLength << dataFlags;

Надеюсь, я не совсем понял, чего вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...