当前位置:   article > 正文

字符串流stringstream--<sstream>

stringstream

字符串流stringstream流详解

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

#include<sstream>

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

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

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

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

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

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

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

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

三种类的内置名称:

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

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

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

C++代码示例:

  1. ostringstream oss;
  2. oss << "GodFishhh and AFish" << " " << 20030331 << endl;
  3. //成员函数str()的无参数形式
  4. cout << oss.str() << endl;
  5. //成员函数str()的有参数形式
  6. oss.str("with parameter");
  7. cout << oss.str() << endl;

程序运行结果:

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

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

oss.str(" ");

C++代码示例:

  1. ostringstream oss;
  2. oss << "GodFishhh and AFish" << " " << 20030331 << endl;
  3. //成员函数str()的无参数形式
  4. cout << oss.str() << endl;
  5. //成员函数str()的有参数形式
  6. //oss.str("with parameter");
  7. oss.str(" ");
  8. cout << oss.str() << endl;

程序运行结果:

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

六.成员函数clear()

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

C++代码示例:

若不通过clear()清除缓冲

  1. stringstream ss;
  2. ss << "GodFishhh";
  3. cout << ss.str() << endl;
  4. ss << "AFish";
  5. cout << ss.str();

程序运行结果:

通过clear()清除缓冲

  1. stringstream ss;
  2. ss << "GodFishhh";
  3. cout << ss.str() << endl;
  4. ss.clear();
  5. ss << "AFish";
  6. cout << ss.str();

程序运行结果:

 

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

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

  1. stringstream ss;
  2. ss << "GodFishhh";
  3. cout << ss.str() << endl;
  4. ss.clear();
  5. ss.str(" ");
  6. ss << "AFish";
  7. cout << ss.str();

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/735993
推荐阅读
相关标签
  

闽ICP备14008679号