目前,我有一个名为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个整数后,它似乎没有效果。然后我使用以下代码打印我的stringstream数据:
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)。
为什么我的stringstream中的数据没有被正确覆盖?
答案 0 :(得分:2)
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]);
}
答案 1 :(得分:0)
我假设你真的想把字符串“12
”写入stringstream。您只需将int
转换为12
即可将 char*
int
转换为char*
。也就是说,我相信你的这部分内容可能不正确:
reinterpret_cast<char*>(&dataLength)
如果dataLength确实是一个int,那么这不是将它变成char*
的正确方法。也许这个:
Data << dataLength << dataFlags;
我希望我没有完全误解你想要实现的目标。