From:https://blog.csdn.net/JoeBlackzqq/article/details/7032703
1 概述
- C++引入了ostringstream、istringstream、stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件。
- istringstream类用于执行C++风格的串流的输入操作。
- ostringstream类用于执行C风格的串流的输出操作。
- strstream类同时可以支持C风格的串流的输入输出操作。
- istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和 stringstreambase派生而来, stringstream则是从iostream类和stringstreambase派生而来。 他们的继承关系如下图所示:
2 istringstream介绍和举例
istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。
istringstream的构造函数原形如下: istringstream::istringstream(string str);
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
istringstream istr;
istr.str("1 56.7");
//上述两个过程可以简单写成 istringstream istr("1 56.7");
cout << istr.str() << endl;
int a;
float b;
istr >> a;
cout << a << endl;
istr >> b;
cout << b << endl;
return 0;
}
输出结果:
1 56.7
1
56.7
分析:上例中,构造字符串流的时候,空格会成为字符串参数的内部分界,例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。
str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)
3 ostringstream介绍和举例
ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。
ostringstream的构造函数原形如下:ostringstream::ostringstream(string str);
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
ostringstream ostr;
ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结 尾开始增加,而是修改原有数据,超出的部分增长
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr;
system("pause");
}
输出结果:
defg请按任意键继续. . .
注释掉这一句:
//ostr.str("abc");
输出结果:
defg请按任意键继续. . .
分析:在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值 得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。
4 stringstream介绍和举例
对于stringstream了来说,它是用于C++风格的字符串的输入输出的。
stringstream的构造函数原形如下:stringstream::stringstream(string str);
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
stringstream ostr("ccc");
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr<<endl;
char a;
ostr>>a; //取出来第一个字符 d
cout<<a;
system("pause");
return 0;
}
输出结果:
defg
d请按任意键继续. . .
除此而外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
stringstream sstr;
//--------int转string-----------
int a=100;
string str;
sstr<<a;
sstr>>str;
cout<<str<<endl;
//--------string转char[]--------
sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
string name = "colinguan";
char cname[200];
sstr<<name;
sstr>>cname;
cout<<cname;
system("pause");
}
输出结果:
100
colinguan请按任意键继续. . .
5 如何使用stringstream分隔逗号分隔字符串
#include <iostream>
#include <sstream>
#include <string>
//using namespace std;
int main()
{
std::string str ="abc def,ghi";
std::stringstream ss(str);
std::string token;
while (ss >> token)
{
printf("%s\n", token.c_str());
printf("asdasdasdsadasd\n");
}
}
输出结果:
abc
asdasdasdsadasd
def,ghi
asdasdasdsadasd
分析:stringstream::>>运算符可以按空格分隔字符串,而不能用逗号分隔,上面的例子每次token读取ss到空格截止,然后进入while循环之中,执行之后继续读取。while停止的条件是ss内容被读取完毕。
#include <iostream>
#include <sstream>
#include <string>
//using namespace std;
int main()
{
std::string input ="abc,def,ghi";
std::istringstream ss(input);
std::string token;
while(std::getline(ss, token, ',')) {
std::cout << token <<std::endl;
}
}
输出结果:
abc
def
ghi