2011-11-22 52 views
5

如何連接兩個stringstreams?在C++中連接stringstream

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include "types.h"  

int main() { 
    char dest[1020] = "you"; 
    char source[7] = "baby"; 
    stringstream a,b; 
    a << source; 
    b << dest; 
    a << b; /*HERE NEED CONCATENATE*/ 
    cout << a << endl; 
    cout << a.str() << endl; 
    return 0; 
} 

的輸出是在這兩種嘗試以下:

0xbf8cfd20 
baby0xbf8cfddc 

所需的輸出是babyyou

回答

11

應該是:

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

stringstream::str返回在stringstream基礎字符串。

+0

當然如上所述,在這種情況下,您不需要2個'stringstream's,但是我認爲給出的示例是一些更復雜的用例的普通版本。 – jli

+0

這將創建b的字符串數據的副本;我認爲提問者可能正在尋找一種避免這樣做的方法。 – JasonDiplomat

4

更一般橫跨iostreams的替代a << b

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

os << is1.rdbuf(); 
os << is2.rdbuf(); 
os << std::flush; 

這適用於文件流,給std :: cin等,以及用於字符串流

6

或者

a << b.rdbuf(); 

前提是get指針是o在流的開始處避免爲內容分配另一個std::string

6

您不需要兩個std::stringstream的實例。一個就足夠了。

std::stringstream a; 
a << source << dest; 

std::string s = a.str(); //get the underlying string 
1

問題是「如何串接STREAMS」,答案解釋瞭如何連接串流的內容。下面是可被用來連接兩個istreams成一個istream的(文件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()); 
} 
}; 

要使用它:

#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,它首先讀取第一個streambuf,然後在讀完第一個時讀取第二個streambuf。