concatenate stringstream in c++

后端 未结 6 471
没有蜡笔的小新
没有蜡笔的小新 2021-01-17 16:20

How can I concatenate two stringstreams?

#include 
#include 
#include 
#include 
#include <         


        
6条回答
  •  广开言路
    2021-01-17 16:54

    The question was "how to concatenate STREAMS", the answers explained how to concatenate the contents of the streams. Here is a class which can be used to concatenate two istreams into one 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::eof()
             : std::char_traits::to_int_type(*this->gptr());
     }
    };
    

    To use it:

    #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;
    

    Basically the class uses the streambuf's from the streams passed to it to create a new streambuf which first reads the first streambuf and then reads the second streambuf when finished with the first one.

提交回复
热议问题