c++中istringstream及ostringstream超详细说明

2023-10-26


前文说过,istringstream是继承于istream,ostringstream是继承于ostream,而他们使用的缓冲区类是stringbuf。

关于这些类之间的关系,有兴趣可以去查看我之前的文章:
c++标准输入输出流关系梳理

1. stringbuf类介绍

stringbuf类缓冲区使用一个std::string类作为存储介质,然后根据构造时的读写模式来对string类进行读写。

1.1 stringbuf类构造函数

小贴士:explicit用来防止由构造函数定义的隐式转换。

//根据传入的读写标示构造一个拥有空string的缓冲区,默认可读可写
explicit basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
: __streambuf_type(), _M_mode(__mode), _M_string()
{ }

//复制一个已有的string作为缓冲区内容,且根据__mode来指定可读、可写或者读写,默认可读可写
explicit basic_stringbuf(const __string_type& __str,
      ios_base::openmode __mode = ios_base::in | ios_base::out)
: __streambuf_type(), _M_mode(), _M_string(__str.data(), __str.size())
{ _M_stringbuf_init(__mode); }

使用例子如下:

#include <sstream>
using namespace std;

int main()
{
	stringbuf *buf = new stringbuf(ios_base::in);//构造一个可写的空stringbuf
	string str("my name is haha");
	stringbuf *bufStr = new stringbuf(str, ios_base::out);

	if ( buf != nullptr )
	{
		delete buf;
	}
	if ( bufStr != nullptr )
	{
		delete bufStr;
	}

	return 0;
}
1.2 str函数

str函数原型如下:

//获取string内容     
__string_type
      str() const;

//参数__s中内容初始化为当前缓冲区string
      void
      str(const __string_type& __s);

使用案例如下:

#include <sstream>
#include <iostream>
using namespace std;

int main()
{
	stringbuf *buf = new stringbuf(ios_base::in);
	string str("my name is haha");
	stringbuf *bufStr = new stringbuf(str, ios_base::out);

	cout << bufStr->str() << endl;
	buf->str(string("my name is not haha"));
	cout << buf->str() << endl;

	if ( buf != nullptr )
	{
		delete buf;
	}
	if ( bufStr != nullptr )
	{
		delete bufStr;
	}

	return 0;
}

还有其他函数这里就不多做介绍了,理论上来讲,我们并不会直接使用stringbuf,因为它只是一个工具人,是藏于暗中滴,大多数时候,我们都是直接使用istringstream和ostringstream。

2. istringstream类

前文说过,实际上istringstream全名应该是basic_istringstream,istringstream只是basic_istringstream的一个char类型实例,下面还是直接使用istringstream来进行代指。

istringstream的构造函数与stringbuf的参数以及类型一模一样,所以直接按照stringbuf的构造函数用法一样使用即可,只是流打开模式上而言,istringstream默认是ios_base::in。

截取构造函数原型如下:

explicit
      basic_istringstream(ios_base::openmode __mode = ios_base::in)
      : __istream_type(), _M_stringbuf(__mode | ios_base::in)
      { this->init(&_M_stringbuf); }
explicit
      basic_istringstream(const __string_type& __str,
			  ios_base::openmode __mode = ios_base::in)
      : __istream_type(), _M_stringbuf(__str, __mode | ios_base::in)
      { this->init(&_M_stringbuf); }

另外istringstream的str函数也是与stringbuf一样,返回了string对象,这里不再多说。

2.1 rdbuf函数

rdbuf函数原型如下:

//返回一个指向stringbuf对象的指针
__stringbuf_type*
      rdbuf() const
      { return const_cast<__stringbuf_type*>(&_M_stringbuf); }

rdbuf使用案例如下:

#include <sstream>
#include <iostream>
using namespace std;

int main()
{
	istringstream istr("istringstream", ios_base::in);
	cout << "string is " << istr.str() << endl;
	cout << "string's len is " << istr.rdbuf()->in_avail() << endl;

	return 0;
}

这里也顺便展示了一下str函数的用法,in_avail是streambuf类里面的一个函数,用于返回当前缓冲区长度。

编译后执行结果如下:

[root@mylinux ~]# ./a.out 
string is istringstream
string's len is 13
[root@mylinux ~]#
2.2 swap函数

swap函数原型如下:

//用于交换两个istringstream内容
void swap(basic_istringstream& __rhs);

用法如下:

#include <sstream>
#include <iostream>
using namespace std;

int main()
{
	istringstream istr1("lilei");
	istringstream istr2("hanmeimei");
	istr1.swap(istr2);
	cout << "istr1 is " << istr1.str() << endl;
	cout << "istr2 is " << istr2.str() << endl;

	return 0;
}

编译后输出结果如下:

[root@mylinux ~]# ./a.out 
istr1 is hanmeimei
istr2 is lilei
[root@mylinux ~]#

可以看到istr1和istr2两个对象的内容是完全交换了。

3.ostringstream类和stringstream类

ostringstream用于往string写入数据,除了构造的时候,默认的打开模式是ios_base::out,其他所有函数都与istringstream一样,且用法也是一样的,这里不再多说。

截取其中一个构造函数原型如下:

//只是构造函数默认参数不一样,其他与istringstream是一样的
explicit
      basic_ostringstream(ios_base::openmode __mode = ios_base::out)
      : __ostream_type(), _M_stringbuf(__mode | ios_base::out)
      { this->init(&_M_stringbuf); }

stringstream是继承于iostream类,它除了构造函数默认模式不一样,其他所有函数也与istringstream用法一样

,它的构造函数原型如下:

explicit
      basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
      : __iostream_type(), _M_stringbuf(__m)
      { this->init(&_M_stringbuf); }

stringstream可用于同时往string写入和读取数据。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++中istringstream及ostringstream超详细说明 的相关文章

随机推荐

  • 【rust】

    系列文章目录 rust 00 开发环境搭建 rust 01 编译并运行第一个rust程序 rust 02 语法基础 变量 不可变 和常量 rust 03 语法基础 数据类型 rust 04 语法基础 函数 rust 05 语法基础 流程控制
  • windows下启动nacos(单机配置)

    windows下启动nacos 下载nacos 找到github地址 并根据对应的版本进行下载 如果下载过慢的话 可以使用迅雷下载 1下载完成后 进行解压 之后打开 conf application properties文件 2 打开后 我
  • 机器学习实战——朴素贝叶斯

    目录 一 朴素贝叶斯理论 1 概述 2 朴素贝叶斯特点 3 贝叶斯决策理论 4 条件概率与全概率公式 5 贝叶斯推断 二 朴素贝叶斯分类器应用 拉普拉斯修正 三 垃圾邮件分类 一 朴素贝叶斯理论 1 概述 朴素贝叶斯算法是有监督的学习算法
  • vue3.0模板

    GitHub Mstian Vue Onepiece Admin vue3 elementPlus后台管理简单模板https github com Mstian Vue Onepiece Admin
  • null,default关键字

    一 null关键字 1 null是空的意思 在表中 默认情况下 所有的字段值都可以为空 1 建表期间 可以对某一字段进行非空约束 not null 在insert时 此字段必须要有数据 create table temo id number
  • libuv之基础

    TCP客户端连接步骤 连接方法 Uv loop t loop uv default loop uv tcp t client malloc uv connect t connect req malloc uv tcp init loop c
  • C++ 仿函数(一)

    目录 一 仿函数是什么 二 仿函数的特点 1 仿函数在使用时 可以像普通函数那样调用 可以有参数 可以有返回值 2 仿函数超出普通函数的概念 可以有自己的状态 编辑3 仿函数可以作为参数传递 三 谓词 一元谓词示例 二元谓词示例 总结 一
  • 银行股的分红是不是比利率要高,投十万银行股一年分红有多少啊?

    工农交建中目前股息均超5 以上 10万元投资银行股 一年分红收益能达到5500左右 银行一年定期存款1 5 10万存款年利息1500 买银行股比存银行一年多收益4000左右
  • dell服务器重装win10,戴尔dell重装win10系统后无法引导的解决方法(原创)

    戴尔新机型都采用 Intel 酷睿第八代以上处理器 戴尔8代以上cpu都不支持传统模式了 默认预装了win10系统不是很好用 想重新安装win10 但是预装win10的机型默认是UEFI引导 但戴尔电脑装win10后出现不能引导情况 一般出
  • OpenFeign配合logback链路追踪

    创建MDC上下文 public class MdcContext MDC上下文 存储tId private static final ThreadLocal
  • 多线程(十)多线程编程示例

    文章目录 一 交替输出1A2B3C4D5E 1 1 synchronized wait notify 1 2 Condition await signal 二 生产者 消费者问题 2 1 synchronized wait notify 2
  • java final关键字修饰局部变量,final关键字的这8个小细节,你get到几个?

    今天来聊 final 关键字 因为最近在看的几本书都讲到了 final 关键字 发现好多小细节自己都忽视了 抽空总结了一下 分享给大家 正文 final关键字是一个常用的关键字 可以修饰变量 方法 类 用来表示它修饰的类 方法和变量不可改变
  • 数据在底层的存储模式

    1 数据的存储模式 大端存储模式 常见于我们的手机等 低地址放高数据 小端存储模式 比如PC 低地址存放低数据 面试题 设计程序判断大小端 这里可以有两种方式 1 写一个函数通过数据类型 int main int a 0x11223344
  • 我的服务器开发之路-安装mysql之mariadb并更改数据库路径

    centos最好安装mariadb 输入rpm qa grep mariadb 并没有显示版本号 则说明并没有安装mariadb 输入yum remove mysql mysql server mysql libs可完全卸载mysql相关
  • K8S个人学习之路

    服务器预备环境 1 永久禁用swap空间 1 临时关闭swap分区 重启失效 swapoff a 2 永久关闭swap分区 sed ri s swap etc fstab 2 修改k8s gcr io 路径的镜像 其他的镜像仓库 MY RE
  • Spark-RDD编程

    Spark在进行计算的时候通常会包含以下几个步骤 创建SparkContext上下文对象 使用SparkContext加载数据创建RDD RDD的转换算子transfotmations RDD的行动算子actions RDD的缓存和持久化
  • 反射获取字段的值与非空校验

    获取指定字段的值 通过字段对应的get方法 public Object getFieldValueByName1 String fieldName Object obj try String firstLetter fieldName su
  • 《Semi-Supervised Semantic Segmentation with Cross-Consistency Training》 2020CVPR 论文阅读

    在这项工作中 作者首先观察到 对于语义分割 低密度区域在隐藏表示中比在输入中更明显 作者提出了交叉一致性训练 其中预测的不变性是施加不同的扰动在编码器输出上 Cross Consistency Training 该模型包含一个共享的enco
  • SQL千万级大数据量查询优化

    转发自 https blog csdn net long690276759 article details 79571421 spm 1001 2014 3001 5506 防止查询资料找不到来源 很详细 1 对查询进行优化 应尽量避免全表
  • c++中istringstream及ostringstream超详细说明

    文章目录 1 stringbuf类介绍 1 1 stringbuf类构造函数 1 2 str函数 2 istringstream类 2 1 rdbuf函数 2 2 swap函数 3 ostringstream类和stringstream类