1

目前,我有一个名为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 和dataFlags0,因此应该分别写入 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)。

为什么我的字符串流中的数据没有被正确覆盖?

4

2 回答 2

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]);  
}
于 2010-10-31T04:19:58.650 回答
0

我假设您真的想将字符串“ 12”写入字符串流。您不能仅通过将 to 转换为a 。也就是说,我相信你的这部分可能是不正确的:int 12char*intchar*

reinterpret_cast<char*>(&dataLength)

如果 dataLength 真的是一个 int,这不是把它变成一个char*. 也许是这样:

Data << dataLength << dataFlags;

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

于 2010-10-31T04:16:36.097 回答