concatenate stringstream in c++

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

How can I concatenate two stringstreams?

#include 
#include 
#include 
#include 
#include <         


        
相关标签:
6条回答
  • 2021-01-17 16:46

    Just replace a << b with a << b.str()

    0 讨论(0)
  • 2021-01-17 16:54

    Should be:

    b << dest;
    a << b.str();
    

    stringstream::str returns the underlying string in the stringstream.

    0 讨论(0)
  • 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<char>::eof()
             : std::char_traits<char>::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.

    0 讨论(0)
  • 2021-01-17 17:00

    Or

    a << b.rdbuf();
    

    provided that get pointer is on the beginning of the stream to avoid allocating yet another std::string for content.

    0 讨论(0)
  • 2021-01-17 17:00

    You don't need two instance of std::stringstream. One is enough for the purpose.

    std::stringstream a;
    a << source << dest;
    
    std::string s = a.str(); //get the underlying string
    
    0 讨论(0)
  • 2021-01-17 17:00

    More generically across iostreams:

    std::istream is1, is2; // eg. (i)stringstream
    std::ostream os;       // eg. (o)stringstream
    
    os << is1.rdbuf();
    os << is2.rdbuf();
    os << std::flush;
    

    This works for filestreams, std::cin etc. as well as for stringstream

    0 讨论(0)
提交回复
热议问题