字符串流stringstream流详解

一.stringstream是C++提供的一个字符串流,与iostream和fstream的操作方法类似,只是功能不同。要使用字符串流必须包含其头文件<sstream>。

#include<sstream>

二.stringstream字符串流通常用来做数据转换,用于字符串与其他变量类型的转换,相较于c库的转换,更加安全、自动和直接。

三.<sstream>库定义了三种类:istringstream、ostringstream、stringstream

①.istringstream:负责流的输入,将字符串数据转换回其实际类型。

istringstream iss;
cout << typeid(iss).name() << endl;

②.ostringstream:负责流的的输出,将不同类型的数据转换为字符串类型数据。

ostringstream oss;
cout << typeid(oss).name() << endl;

③.stringstream:同时负责流的输入和输出(类似于fstream相较于ifstream和ofstream)

stringstream ss;
cout << typeid(ss).name() << endl;

三种类的内置名称:

四. 通过插入器"<<"和析取器">>"这两个运算符可以直接对stringstream上的数据进行输入和输出,而将stringstream中的全部数据输出则是使用成员函数str(),有两种形式:

①.void str():无参数形式,用于将stringstream中的数据以string字符串的形式输出

②.void str(const string&s1):以字符串为参数,覆盖stringstream流中的数据

C++代码示例:

ostringstream oss;
oss << "GodFishhh and AFish" << " " << 20030331 << endl;
//成员函数str()的无参数形式
cout << oss.str() << endl;

//成员函数str()的有参数形式
oss.str("with parameter");
cout << oss.str() << endl;

程序运行结果:

可知oss.str("with parameter")用参数with parameter覆盖了先前oss流中的内容。

五.利用有参数的成员函数void str(const string&s1)清空流中的数据

oss.str(" ");

C++代码示例:

ostringstream oss;
oss << "GodFishhh and AFish" << " " << 20030331 << endl;
//成员函数str()的无参数形式
cout << oss.str() << endl;

//成员函数str()的有参数形式
//oss.str("with parameter");
oss.str(" ");
cout << oss.str() << endl;

程序运行结果:

此时运行结果的第二行为空,可知oss流中的数据已被清空。

六.成员函数clear()

stringstream的成员函数clear()与fstream中的成员函数clear()类似,可以通过clear()函数清除流的错误状态,主要用在stringstream重复使用时或者多个stringstream对象构造时进行清空,防止之前的缓冲停留在输入输出流中。

C++代码示例:

若不通过clear()清除缓冲

stringstream ss;
ss << "GodFishhh";
cout << ss.str() << endl;
ss << "AFish";
cout << ss.str();

程序运行结果:

通过clear()清除缓冲

stringstream ss;
ss << "GodFishhh";
cout << ss.str() << endl;
ss.clear();
ss << "AFish";
cout << ss.str();

程序运行结果:

 

 发现程序的运行结果并没有发生改变,这是什么原因呢?

  利用成员函数clear()只能清空流的状态,但此时流占用的内存没有改变,多次调用同一个ss对象则导致内存会一直增加,因为stringstream不主动释放内存,若想改变内存,则需要配合成员函数void str(const string&s1)来完成。

stringstream ss;
ss << "GodFishhh";
cout << ss.str() << endl;
ss.clear();
ss.str(" ");
ss << "AFish";
cout << ss.str();

此时stringstream先前调用所储存的内容被完全清除,完成对stringstream对象的多次调用。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐