La pregunta era "cómo concatenar Streams", las respuestas explican cómo concatenar el contenido de los cursos de agua. Aquí es una clase que puede ser usado para concatenar dos iStreams en uno istream (ConcatStreams.h archivo):
class ConcatStreams
: public std::streambuf {
std::streambuf* sbuf1_;
std::streambuf* sbuf2_;
char* buffer_;
int useBuf;
int bufSize;
public:
ConcatStreams(std::streambuf* sbuf1, std::streambuf* sbuf2)
: bufSize(1024), sbuf1_(sbuf1), sbuf2_(sbuf2), buffer_(new char[bufSize]), useBuf(1) {
}
ConcatStreams(const ConcatStreams& orig);
virtual ~ConcatStreams() { delete[] this->buffer_; }
int underflow() {
if (this->gptr() == this->egptr()) {
// get data into buffer_, obtaining its input from
// this->sbuf_; if necessary resize buffer
// if no more characters are available, size == 0.
std::streamsize size=0;
if(useBuf==1) {
size = this->sbuf1_->sgetn(this->buffer_, bufSize);
if(!size) { useBuf++;}
}
if(useBuf==2) {
size = this->sbuf2_->sgetn(this->buffer_, bufSize);
if(!size) { useBuf++;}
}
this->setg(this->buffer_, this->buffer_, this->buffer_ + size);
}
return this->gptr() == this->egptr()
? std::char_traits<char>::eof()
: std::char_traits<char>::to_int_type(*this->gptr());
}
};
utilizarlo:
#include "ConcatStreams.h"
istringstream msgIn1("this is a stream.");
istringstream msgIn2("this is another stream.");
ConcatStreams cs(msgIn1.rdbuf(), msgIn2.rdbuf());
istream msgIn(&cs);
cout << "'" << msgIn.rdbuf() << "'" << endl;
Básicamente utiliza la clase de los streambuf de las corrientes pasaron para crear un nuevo streambuf que primero lea el primer streambuf y luego lea el segundo streambuf cuando termine con el primero.
Por supuesto, como se mencionó, no es necesario 2 'stringstream's en este caso, sin embargo, supuse que el ejemplo dado es una versión trivial de un caso de uso más complejo. – jli
Esto creará una copia de los datos de cadena de b; Creo que el interlocutor puede estar buscando una forma de evitar hacer eso. – JasonDiplomat