背景
- C++引入了ostringstream istringstream stringstream这三个类,包含
#include<sstream>
头文件 - istringstream类似于C++风格字符串的输入操作
- ostringstream类似于C++风格字符串的输出操作
- stringstream可以同时支持C++风格字符串输入输出操作
istringstream类是从istream和stringstreambase派生而来,ostringstream是从ostream和stringstreambase派生而来,stringstream则是从iostream和stringstreambase派生而来
继承关系如图所示:
1. istringstream
istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。其构造函数原型如下:
istringstream::istringstream(string str)
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
istringstream istr;
istr.str("1 55.5"); // istringstream istr("1 55.5")
cout << istr.str() << endl;
int a;
float b;
istr >> a; // 将整形插入到a中
cout << a << endl;
istr >> b; // 将浮点数插入到b中
cout << b << endl;
system("pause");
return 0;
}
运行结果:
构造字符串流的时候,空格会成为字符串参数的内部分割,例子中对a,b对象的输入“赋值”操作证明了这一点,字符串的空格成为了整形数据与浮点型数据
的分界点,利用分界点可以完成字符串到整形对象与浮点型对象的转换
str()成员函数的使用可以让istringstream对象返回一个string字符串(cout<<istr.str(); )
2. ostringstream
ostringstream同样是由一个string()对象构造而来,ostringstream类向一个string插入字符
ostringstream构造函数原型:
ostringstream::ostringstream(string str)
示例代码:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
/*
ostringstream ostr;
ostr << "gyz" << endl;
ostr << "cto" << endl;
cout << ostr.str() << endl;
ostr.put('w');
ostr.put('o');
cout << ostr.str() << endl; //构造时未设置字符串参数,在原字符串尾部添加
string gstr = ostr.str();
cout << gstr.c_str() << endl;
*/
ostringstream ostr;
ostr.str("wo ba shi wo ba~");
//ostr << "gyz"; // 在原有字符串的基础上修改
cout << ostr.str() << endl;
ostr.put('n');
ostr.put('i');
cout << ostr.str() << endl; // 如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据
string gstr = ostr.str();
cout << gstr.c_str() << endl;
system("pause");
return 0;
}
当我们通过put()或者左移操作符可以不断的向ostr插入单个字符或是字符串,通过str()函数返回增长后的完整字符串数据。要注意一点,当构造的时候对象里已经存在字符串数据的时候,则put()增长操作不会从结尾开始增加,而是在原有数据的基础上修改
3. stringstream
构造函数原型:
stringstream::stringstream(string str)
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
stringstream ostr('gyz');
//ostr << "king";
ostr.put('h');
ostr.put('a');
ostr << "king";
string gstr = ostr.str();
cout << gstr << endl;
char a;
ostr >> a;
cout << a << endl;
system("pause");
return 0;
}
除此之外,stringstream类的对象还常用它进行string与各种内置类型数据之间的转换
#include <iostream>
#include <sstream>
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(); // 每次转换之后调用clear()成员函数
string name = "collisionmesh";
char cname[265];
sstr << name;
sstr >> cname;
cout << cname << endl;
system("pause");
return 0;
}
在多次转换中使用同一个stringstream对象,记得每次转换前要使用clear()方法;
在多次转换中重复使用一个stringstream对象的最大好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。