C++

2011-11-22 12 views
5

में स्ट्रिंगस्ट्रीम को संयोजित करें मैं दो स्ट्रिंगस्ट्रीम को कैसे जोड़ सकता हूं?C++

#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::strstringstream में अंतर्निहित स्ट्रिंग देता है।

+0

बेशक जैसा कि आपने बताया है कि आपको इस मामले में 2 'स्ट्रिंगस्ट्रीम की आवश्यकता नहीं है, हालांकि मुझे लगता है कि दिया गया उदाहरण कुछ जटिल उपयोग केस का एक छोटा संस्करण है। – jli

+0

यह बी के स्ट्रिंग डेटा की एक प्रति बना देगा; मुझे लगता है कि प्रश्नकर्ता ऐसा करने से बचने के लिए एक रास्ता तलाश रहा है। – JasonDiplomat

4

अधिक सामान्य रूप से भर में iostreams बदल देते हैं:

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

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

यह filestreams के लिए काम करता है, std :: CIN आदि के साथ-साथ stringstream के लिए

6

या

a << b.rdbuf(); 

बशर्ते कि पॉइंटर प्राप्त हो सामग्री के लिए अभी तक std::string आवंटित करने से बचने के लिए स्ट्रीम की शुरुआत।

6

आपको std::stringstream के दो उदाहरण की आवश्यकता नहीं है। एक उद्देश्य के लिए पर्याप्त है।

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

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

सवाल "जोड़ करने के लिए कैसे धाराओं" था, जवाब में विस्तार से बताया धाराओं की सामग्री को श्रेणीबद्ध करने के लिए कैसे।

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 श्रेणीबद्ध करने के लिए इस्तेमाल किया जा सकता है इसे एक नया स्ट्रीमबफ बनाने के लिए जो पहले पहली स्ट्रीमबफ पढ़ता है और फिर पहले स्ट्रीम के साथ समाप्त होने पर दूसरा स्ट्रीमबफ पढ़ता है।