Question: What I want to do is to create string stream , and output stream, giving the buffer of string stream to output stream, so that it will output data to the string stream. Everything seems fine, but when I try to add data to buffer of the string stream it overrides the previous data. My question is why? and how can achieve a result, such that it does not override but simply adds to the string stream. Here is my code below:

```
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
using namespace std;

 int main ()
{

 stringstream s1("hello I am string stream");
 streambuf *s1_bfr =  s1.rdbuf();
 ostream my_stream (s1_bfr);
 my_stream <<"hey"<<endl;
 cout <<s1.rdbuf()<<endl; //gives the result  : " hey o I am string stream"( seems to me overriden)

return 0;
}

```

Answer: 
The reason that the string in the `stringstream` object is being overwritten when you write to it using the `ostream` object is that, by default, the `ostream` object writes to the beginning of the stream buffer. This means that when you write the string "hey" to the `ostream` object, it replaces the initial string in the `stringstream` object.

To fix this issue, you can use the ostream::seekp method to move the write position of the ostream object to the end of the stream buffer before writing to it. Here is an example of how you might do this:

```
stringstream s1("hello I am string stream");
streambuf *s1_bfr =  s1.rdbuf();
ostream my_stream (s1_bfr);
my_stream.seekp(0, ios_base::end); // move the write position to the end of the stream
my_stream <<"hey"<<endl;
cout <<s1.rdbuf()<<endl;

```

After making this change, the output of the program should be "hello I am string streamhey".

Alternatively, you can use the `stringstream::str` method to retrieve the current contents of the `stringstream` object as a `string`, and then append the new string to the end of this `string`. Here is an example of how you might do this:

```
stringstream s1("hello I am string stream");
string str = s1.str();
str += "hey\n";
s1.str(str);
cout <<s1.rdbuf()<<endl;

```
If you want to append the data in the beginning:

```
 #include <iostream>
 #include <iomanip>
 #include <string>
 #include <sstream>

    using namespace std;

    int main() {
        stringstream s1("hello I am string stream");
        streambuf *s1_bfr =  s1.rdbuf();
        stringstream temp; //Create a temp stringsteam
        temp << "hey"; //add desired string into the stream
        temp << s1_bfr; //then add your orignal stream
        s1 = move(temp); // or ss.swap(temp); 
        cout <<s1_bfr<<endl;

        return 0;
    }

```