如何连接两个字符串流?
#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
。
答案 0 :(得分:13)
答案 1 :(得分:8)
或者
a << b.rdbuf();
前提是get指针位于流的开头,以避免为内容分配另一个std::string
。
答案 2 :(得分:6)
您不需要两个std::stringstream
实例。一个就足够了。
std::stringstream a;
a << source << dest;
std::string s = a.str(); //get the underlying string
答案 3 :(得分:5)
更多关于iostreams的信息:
std::istream is1, is2; // eg. (i)stringstream
std::ostream os; // eg. (o)stringstream
os << is1.rdbuf();
os << is2.rdbuf();
os << std::flush;
这适用于文件流,std :: cin等以及stringstream
答案 4 :(得分:1)
只需将a << b
替换为a << b.str()
答案 5 :(得分:1)
问题是&#34;如何连接STREAMS&#34;,答案解释了如何连接流的内容。这是一个可用于将两个istream连接成一个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,然后在完成第一个streambuf时读取第二个streambuf。