字符串流stringstream--<sstream>
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
字符串流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对象的多次调用。