首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“覆盖”时的字符串流write()问题

“覆盖”时的字符串流write()问题
EN

Stack Overflow用户
提问于 2010-10-31 12:05:38
回答 2查看 839关注 0票数 1

目前,我有一个名为Data的字符串流。我通过使用以下命令来查找字符串流的开头:

代码语言:javascript
复制
Data.seekp(0, std::ios::beg);

然后,我尝试向字符串流的前8个字节写入2个整数(以前,前8个字节被设置为0)

代码语言:javascript
复制
Data.write(reinterpret_cast<char*>(&dataLength),sizeof(int));
Data.write(reinterpret_cast<char*>(&dataFlags),sizeof(int));

使用Visual C++调试器,当我设置断点时,我可以看到dataLength等于12,dataFlags等于0,因此它应该分别写入12和0。

在写完这两个整数后,似乎没有效果。然后我使用以下代码打印我的字符串流数据:

代码语言:javascript
复制
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)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-31 12:19:59

代码语言:javascript
复制
char* b = const_cast<char*>(Data.str().c_str());

Data.str()是一个临时值,在该语句结束时会被销毁;该临时值的c_str()只能在临时值处于活动状态时使用(而且您没有对其进行任何修改,因为std::string的失效规则很复杂)。你永远不能在没有定义行为的情况下使用b。

代码语言:javascript
复制
std::string b = Data.str();
for (int i = 0; i < b.size(); i++) {  
  printf("%02X ", (unsigned char) b[i]);  
}
票数 2
EN

Stack Overflow用户

发布于 2010-10-31 12:16:36

我假设您真的希望将字符串"12“写入字符串流中。您不能仅通过将int 12转换为char*来将int转换为char*。也就是说,我认为你的这一部分可能是不正确的:

代码语言:javascript
复制
reinterpret_cast<char*>(&dataLength)

如果dataLength真的是一个整数,这不是将其转换为char*的正确方法。也许是这样的:

代码语言:javascript
复制
Data << dataLength << dataFlags;

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4061808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档