2010-10-31 100 views
1

目前,我有一个名为Data的字符串流。我要求的字符串流的开始使用:Stringstream write()问题,同时“覆盖”

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
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]); 
} 
+0

谢谢:)工作很棒! – Brad 2010-10-31 04:32:04

0

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

reinterpret_cast<char*>(&dataLength) 

如果数据长度确实是一个int,这不是把它变成一个char*的正确方法。也许这个:

Data << dataLength << dataFlags; 

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

+1

我想写整数(构成整数的二进制)到字符串流。 char *只是将int *转换为char *,所以我可以正确地将它写入到字符串流中。但是写整数似乎没有效果。我没有试图将整数转换为字符串,但我只是想写整数。 – Brad 2010-10-31 04:18:51