सवाल "जोड़ करने के लिए कैसे धाराओं" था, जवाब में विस्तार से बताया धाराओं की सामग्री को श्रेणीबद्ध करने के लिए कैसे।
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());
}
};
इसका इस्तेमाल करने के लिए::
#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;
मूल रूप से वर्ग streambuf के उपयोग करता धाराओं पारित कर से यहां कक्षा जो एक IStream (फ़ाइल ConcatStreams.h) में दो istreams श्रेणीबद्ध करने के लिए इस्तेमाल किया जा सकता है इसे एक नया स्ट्रीमबफ बनाने के लिए जो पहले पहली स्ट्रीमबफ पढ़ता है और फिर पहले स्ट्रीम के साथ समाप्त होने पर दूसरा स्ट्रीमबफ पढ़ता है।
स्रोत
2013-06-14 07:29:19
बेशक जैसा कि आपने बताया है कि आपको इस मामले में 2 'स्ट्रिंगस्ट्रीम की आवश्यकता नहीं है, हालांकि मुझे लगता है कि दिया गया उदाहरण कुछ जटिल उपयोग केस का एक छोटा संस्करण है। – jli
यह बी के स्ट्रिंग डेटा की एक प्रति बना देगा; मुझे लगता है कि प्रश्नकर्ता ऐसा करने से बचने के लिए एक रास्ता तलाश रहा है। – JasonDiplomat