目前,我有一个名为Data的字符串流。我通过使用以下命令来查找字符串流的开头:
Data.seekp(0, std::ios::beg);然后,我尝试向字符串流的前8个字节写入2个整数(以前,前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。
在写完这两个整数后,似乎没有效果。然后我使用以下代码打印我的字符串流数据:
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)。
为什么我的字符串流中的数据没有被正确覆盖?
发布于 2010-10-31 12:19:59
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]);
}发布于 2010-10-31 12:16:36
我假设您真的希望将字符串"12“写入字符串流中。您不能仅通过将int 12转换为char*来将int转换为char*。也就是说,我认为你的这一部分可能是不正确的:
reinterpret_cast<char*>(&dataLength)如果dataLength真的是一个整数,这不是将其转换为char*的正确方法。也许是这样的:
Data << dataLength << dataFlags;我希望我没有完全误解你想要实现的目标。
https://stackoverflow.com/questions/4061808
复制相似问题