对stringstream行为的补充

文章目录

    • 前言
    • gcc源码分析
    • 总结

前言

在之前的文章C++snprintf和stringstream中说到,在stringstream中不知道是维护了一个流指针还是计数器,导致我们在使用了str()后再使用"<<"向其尾部增加字符会导致意想不到的效果,现在我又翻了下gcc源码,找到了答案。

gcc源码分析

我们先来看看str()的逻辑是怎样的:

void str(const __string_type& __s){ _M_stringbuf.str(__s); }

所以,此时的重点就应该在它所调用的重载str()中:

void str(const __string_type& __s)
{// Cannot use _M_string = __s, since v3 strings are COW// (not always true now but assign() always works)._M_string.assign(__s.data(), __s.size());_M_stringbuf_init(_M_mode);
}

根据gcc对函数的描述,我们将目光着重放在_M_stringbuf_init函数中,从命名上可以知道它会对stringstream的模式进行设置:

void _M_stringbuf_init(ios_base::openmode __mode)
{_M_mode = __mode;__size_type __len = 0;if (_M_mode & (ios_base::ate | ios_base::app))__len = _M_string.size();_M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
}

所以,调用这个函数的时候,传入的__mode就成了关键。
在str()中,传入的参数是__M_mode,在函数中我们却没有对它的定义,可知它是一个成员:
在这里插入图片描述
由此找到了它的定义如上图,该成员定义在类basic_stringbuf中,这个类不是stringstream继承关系中的一环。
这个类是个独立的类,用于在内存中操作字符串的缓冲区。它提供了类似于文件流的接口,允许读写字符串。这就是stringstream操作字符流的根本。我们能够通过控制它,对程序的IO流进行操作,但是如果我们不改变IO流的模式,我们就没法实现我们想要的效果。
即:不管是使用istringstream、ostringstream、stringstream都存在同样的问题,没法通过这三个类实现我们想要的效果,只能通过更改缓冲区的模式来实现,这是它们的实现导致的

我们想要的效果是什么呢?
这里给个例子吧:
stringstream ss;
ss,str("Hello ");
ss << “World”;
在执行了这三行代码后,ss.str()的结果应该是”Hello world“,但是实际上是”World “

总结

可以发现,我们没法解决str()和“<<”一同使用导致的冲突问题,这是因为stringstream本就不支持更改流状态这个操作,会这样是由于缓冲区的模式导致的

str()实际上会重置流的状态,包括清空缓冲区以及重新设置流的位置等信息。
如果想要设置字符串内容,应该在操作完成后再调用 str() 函数,而不是在写入操作中间调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/469595.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

函数求导法则【高数笔记】

【分类】 1. 四则运算求导 2. 复合运算求导 3. 整体思想求导 #整体思想求导本质是运用复合运算求导&#xff0c;只不过是对复合运算求导的一种精炼 #无论是具体函数还是抽象函数求导&#xff0c;方法是一致的 【四则运算求导】 加&#xff0c;减&#xff0c;乘&#xff0c;除&a…

vue学习106-120

创建项目p106 router&#xff0c;store和app.vue不用删 清一下router里的路由配置 vant组件库p107 目标&#xff1a;认识第三方vue组件库vant-ui&#xff08;cv战士&#xff09; 封装好了的组件整合在一起就是组件库 http://vant-contrib.gitee.io/vant/v2/#/zh-CN/ vue2用va…

Codeforces Round 925 (Div. 3) E. Anna and the Valentine‘s Day Gift (Java)

Codeforces Round 925 (Div. 3) E. Anna and the Valentine’s Day Gift (Java) 比赛链接&#xff1a;Codeforces Round 925 (Div. 3) E题传送门&#xff1a;E. Anna and the Valentine’s Day Gift 题目&#xff1a;E. Anna and the Valentine’s Day Gift 样例 #1 样例输…

git stash 正确用法

目录 一、背景 二、使用 2.1 使用之前&#xff0c;先简单了解下 git stash 干了什么&#xff1a; 2.2 git stash 相关命令 2.3 使用流程 1. 执行 git stash 2. 查看刚才保存的工作进度 git stash list 3. 这时候在看分支已经是干净无修改的(改动都有暂存到 stash) 4. 现在…

NetMizer 日志管理系统 多处前台RCE漏洞复现

0x01 产品简介 NetMizer是提供集成应用交付和应用安全解决方案以实现业务智能网络的优秀全球供应商,为全球企业和运营商提供确保关键业务应用的全面可用性、高性能和完善的安全性的解决方案。 0x02 漏洞概述 NetMizer 日志管理系统position.php、hostdelay.php、等接口处存在…

二叉树基础总结

目录 树的定义&#xff1a; 深度和高度&#xff1a; 二叉树 由来 二叉树种类&#xff1a; 满二叉树&#xff1a; 完全二叉树&#xff1a; 严格二叉树&#xff08;Strict Binary Tree&#xff09;&#xff1a; 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&…

Pandas数据库大揭秘:read_sql、to_sql 参数详解与实战篇【第81篇—Pandas数据库】

Pandas数据库大揭秘&#xff1a;read_sql、to_sql 参数详解与实战篇 Pandas是Python中一流的数据处理库&#xff0c;而数据库则是数据存储和管理的核心。将两者结合使用&#xff0c;可以方便地实现数据的导入、导出和分析。本文将深入探讨Pandas中用于与数据库交互的两个关键方…

【ArcGIS Pro二次开发】(79):符号系统_CIMUniqueValueRenderer

CIMUniqueValueRenderer是ArcGIS Pro SDK中的一个类&#xff0c;用于创建唯一值渲染器&#xff08;Unique Value Renderer&#xff09;。 在ArcGIS Pro中长这样&#xff1a; 通过对CIMUniqueValueRenderer的操作&#xff0c;可以对符号系统进行更改&#xff0c;实现很多功能。…

【机器学习案例4】为机器学习算法编码分类数据【含源码】

目录 编码分类数据 序数编码 标签编码 一次性编码 目标编码 目标编码的优点 目标编码的缺点 在现实生活中,收集的原始数据很少采用我们可以直接用于机器学习模型的格式,即数值型数据。因此,需要进行一些预处理,以便以正确的格式呈现数据、选择信息丰富的数据或降低其…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒处理流程

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了有利保障&#xff0c;越来越多的企业走向数字化办公模式&#xff0c;并且企业的发展离不开数据支撑&#xff0c;重视数据安全成为了众多企业关心的主要话题。春节前后&#xff0c;云天数据恢复中心接到很多企业的求…

Python环境下基于最大离散重叠小波变换和支持向量回归的金融时间序列预测

金融时间序列具有非线性、高频性、随机性等特点&#xff0c;其波动情况不仅与当前股票市场、房地产市场、贸易市场等有强联动性&#xff0c;而且大幅度起伏对于其他市场有较大的影响和冲击。由于金融市场受多种因素影响且各影响因素间也存在一定复杂动态交互关系&#xff0c;导…

代码随想录刷题笔记 DAY 26 | 组合总和 No.39 | 组合求和 II No.40 | 分割回文串 No.131

文章目录 Day 2501. 组合总和&#xff08;No. 39&#xff09;1.1 题目1.2 笔记1.3 代码 02. 组合求和 II&#xff08;No. 40&#xff09;2.1 题目2.2 笔记2.3 代码 03. 分割回文串&#xff08;No. 131&#xff09;3.1 题目3.2 笔记3.3 代码 Day 25 01. 组合总和&#xff08;No…