views:

38

answers:

2

Currently, I have a stringstream called Data. I am seeking to the beginning of the stringstream by using:

Data.seekp(0, std::ios::beg);

Then, I try writing 2 integers to the first 8 bytes of the stringstream (previously, the first 8 bytes were set to 0)

Data.write(reinterpret_cast<char*>(&dataLength),sizeof(int));
Data.write(reinterpret_cast<char*>(&dataFlags),sizeof(int));

Using the Visual C++ debugger and when I set a breakpoint, I can see that dataLength is equal to 12, and dataFlags is equal to 0, so therefore it should be writing 12 and 0 respectively.

After writing the 2 integers, it seemed to have no effect. I then print my stringstream data using the following code:

char* b = const_cast<char*>(Data.str().c_str());  
for (int i = 0; i < dataLength; i++)  
{  
    printf("%02X ",(unsigned char)b[i]);  
}

I can see that the first 8 bytes of my data are still 0's even though I just overwrote the first 12 bytes with two integers (where the first integer != 0).

Why isn't the data in my stringstream being overwritten properly?

A: 

I assume you really want to write the string "12" into the stringstream. You can't convert the int 12 to a char* by merely casting the int to char*. That is, I believe this part of your might be incorrect:

reinterpret_cast<char*>(&dataLength)

If dataLength is really an int, this is not the correct way to turn it into a char*. Perhaps this:

Data << dataLength << dataFlags;

I hope I haven't totally misunderstood what you're trying to achieve.

Mike Clark
I'm trying to write the integer (The binary that makes up the integer) to the stringstream. The char* is simply casting the int* to a char* so I can properly write it to the stringstream. But writing the integer seems to have no effect. I'm not trying to convert the integer to a string, but I'm just trying to write the integer.
Brad
+2  A: 
char* b = const_cast<char*>(Data.str().c_str());

Data.str() is a temporary, which is destroyed at the end of this statement; the value of that temporary's c_str() can only be used while the temporary is alive (and you've made no modifications to it, the invalidation rules are complex for std::string). You can never use b without Undefined Behavior.

std::string b = Data.str();
for (int i = 0; i < b.size(); i++) {  
  printf("%02X ", (unsigned char) b[i]);  
}
Roger Pate
Thank you :) Worked great!
Brad