After some more research on this problem, and scrutiny of my code, I came across a post suggesting the use of a hand-coded std::streambuf
class. The idea behind this code is to create a streambuf
that initializes its internals to refer to the given buffer. The code is as follows.
#include <streambuf>
template <typename char_type>
struct ostreambuf : public std::basic_streambuf<char_type, std::char_traits<char_type> >
{
ostreambuf(char_type* buffer, std::streamsize bufferLength)
{
// set the "put" pointer the start of the buffer and record it's length.
setp(buffer, buffer + bufferLength);
}
};
Now if you look at my original code, you will notice that I didn’t really need a stringstream
to begin with. All I really needed was a way to write to an external buffer using the IOStream library and std::ostream
is a much better type to address this problem. Incidentally, I suspect this is how the array_sink type from Boost.IOStreams is implemented.
Here is the modified code that uses my ostreambuf
type.
#include <ostream>
#include "ostreambuf.h" // file including ostreambuf struct from above.
void FillBuffer(char* buffer, unsigned int size)
{
ostreambuf<char> ostreamBuffer(buffer, size);
std::ostream messageStream(&ostreamBuffer);
messageStream << "Hello" << std::endl;
messageStream << "World!" << std::endl;
}