字符串流stringstream--<sstream>

字符串流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对象的多次调用。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值