Stringstream write()问题,而“覆盖”

时间:2010-10-31 04:05:38

标签: c++ stringstream undefined-behavior

目前,我有一个名为Data的字符串流。我正在使用:

来寻找stringstream的开头
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中的数据没有被正确覆盖?

2 个答案:

答案 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;

我希望我没有完全误解你想要实现的目标。