la domanda era "come concatenare STREAMS", le risposte hanno spiegato come concatenare il contenuto dei corsi d'acqua. Qui è una classe che può essere utilizzato per concatenare due iStreams in un istream (file ConcatStreams.h):
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());
}
};
usarlo:
#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;
In sostanza la classe utilizza i streambuf di dai flussi passati ad esso per creare un nuovo streambuf che prima legge il primo streambuf e poi legge il secondo streambuf una volta terminato con il primo.
fonte
2013-06-14 07:29:19
Naturalmente come accennato in questo caso non è necessario 2 'stringstream's, tuttavia ho assunto che l'esempio dato sia una versione banale di un caso d'uso più complesso. – jli
Ciò creerà una copia dei dati di stringa di b; Penso che l'interrogante stia cercando un modo per evitare di farlo. – JasonDiplomat