~~~~我的生活,我的点点滴滴!!



iostream 标准库支持内存中的输入/输出,只要将流与存储在程序内存中的 string 对象捆绑起来即可。此时,可使用 iostream 输入和输出

操作符读写这个 string 对象。标准库定义了三种类型的字符串流: 


    istringstream,由 istream 派生而来,提供读 string 的功能

    ostringstream,由 ostream 派生而来,提供写 string 的功能

    stringstream,由 iostream 派生而来,提供读写 string 的功能


使用上述类时,要带上头文件sstream头文件。

1、stringstream




提供了读写一体的功能,很多时候用下面两种来替代他



//创建自由的stringstream对象
stringstream strm;
//或者,通过string副本来生成stringstream对象
stringstream strm(s);


//返回strm中存储的string对象
strm.str();
//或者将string类型的s复制给strm,返回void
strm.str(s);





2、istreamstream


我们经常碰到一会以一个单词输入的,一会又以一行输入的,当他们两种情况同时出现在一起的时候,我们应该怎么办了?

答案:

    肯定要先以行的形式读取进来,然后在以单词的方式分割,有没有好的分割方法了,当然就




string line, world;
while( getline(cin, line) )
{
	istreamstream stream(line);
	
	while( stream >> world )
	{
		//dosomething
		//这样是不是就很方便的把一行字符串以单词的形式分割开了
		//不用自己傻傻的去挨个分离了
	}
}





3、ostreamstream



ostreamstream最常用的方式就是多种数据类型之间的自动格式化转换,假如有一个数值型集合,里面包含int、flaot、double等等,通通都要转

换成string然后与其他的字符串拼接,最后展现出来,或者反之!这个时候用ostreamstream是在好不过了。


int a = 55;
double b = 60.786;

string str = "";

ostreamstream os;
os << a << "--" << b;

str = os.str();

cout << str << endl;




最后输出就是 55--60.786。

他最后变成字符串了,和sprintf类似,但是如果按下面这样写,那是不是立马觉得他比sprintf高大上了!!!!!

template <typename T> std::string toStr(const T & t)
{
	std::ostreamstream os;
	os << t;
	return os.str();
}




通过模板,就统一了函数接口,不管传进来的是什么类型,都可以统一转成string在返回。



int a = 55;
double b = 60.789;
std::string str = "hahaha a = ";
str += toStr(a);
str += ", b = ";
str += toStr(b);

上述只是简单的罗列了一下他们的用法,更多更详细的使用还得去看c++官方给的解释与函数接口。。

很多时候,只需要知道上述的用法就满足我们的开发要求了。。