C++ stringstream介绍以及使用

背景

  • 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时间的。

猜你喜欢

转载自blog.csdn.net/gaoyz1/article/details/85844890
今日推荐