c++11 标准模板(STL)(std::basic_stringbuf)(五)

news2025/5/15 18:50:45
定义于头文件 <sstream>
template<

    class CharT,
    class Traits = std::char_traits<CharT>,
    class Allocator = std::allocator<CharT>

> class basic_stringbuf : public std::basic_streambuf<CharT, Traits>

std::basic_stringbuf 是关联字符序列为内存常驻的任意字符序列的 std::basic_streambuf 。能从 std::basic_string 的实例初始化它,或将它做成该类的实例。

std::basic_stringbuf 的典型实现保有一个 std::basic_string 类型对象,或等价的可伸缩序列容器作为数据成员,并将它同时用作受控制字符序列(为 std::basic_streambuf 的六个指针所指向的数组)和关联字符序列(所有输入操作的字符源和输出操作的目标)。

另外,典型的实现保有一个 std::ios_base::openmode 类型的数据成员,以指示流的状态(只读、只写、读写、尾端写等)。

若 overflow() 使用过分配策略,则可存储另外的高水位指针,以跟踪最后初始化的字符。(C++11 起)

亦提供二个对常用字符类型的特化:

类型定义
stringbufbasic_stringbuf<char>
wstringbufbasic_stringbuf<wchar_t>


受保护成员函数

回放字符到输出序列中

std::basic_stringbuf<CharT,Traits,Allocator>::pbackfail

protected:
virtual int_type pbackfail( int_type c = Traits::eof() )

 此受保护虚函数为公开函数 basic_streambuf::sungetc 和 basic_streambuf::sputbackc 所调用(转而为 basic_istream::unget 和 basic_istream::putback 所调用)。

1) 调用方要求获取区后备一个字符(以无参数或以 Traits::eof() 为参数调用 pbackfail()

a) 首先,检查是否有回放位置,而若确实无回放位置则失败( stringbuf 无重读用的外部字符序列)

b) 若调用方错误而回放位置实际上可用,则简单地自减 basic_streambuf::gptr() ,例如以调用 gbump(-1) 。

2) 调用方试图回放的字符异于之前取得者(以要需要放回的字符调用 pbackfail() ),该情况下

a) 首先,检查是否有回放位置,若无则失败。

b) 然后检查会放位置中有什么字符。若其处保有的字符已等于 c ,以 Traits::eq(to_char_type(c), gptr()[-1]) 确定,则简单地自减 basic_streambuf::gptr() 。

c) 否则,若缓冲区仅为读取打开,则失败。

d) 否则,若缓冲区为写入打开( mode && std::ios_base::out 非零),则自减 basic_streambuf::gptr() 并写入 c 到调整后的 gptr() 所指向的位置。

参数

c-要返回的字符,或若要求指示获取区的后备则为 Traits::eof()

返回值

成功时为 c ,除非 c 为 Traits::eof() ,该情况下返回 Traits::not_eof(c) 。

失败时为 Traits::eof() 。

调用示例

#include <sstream>
#include <string>
#include <iostream>

//  typedef basic_stringbuf<char> 	stringbuf;
struct mybuf : std::stringbuf
{
    mybuf(const std::string& new_str,
          std::ios_base::openmode which =
              std::ios_base::in | std::ios_base::out)
        : std::stringbuf(new_str, which) {}

    int_type pbackfail(int_type c) override
    {
        std::cout << "Before pbackfail(): get area size is "
                  << egptr() - eback() << ' '
                  << " put area size is "
                  << epptr() - pbase() << std::endl;

        int_type ch = std::stringbuf::pbackfail(c);

        std::cout << "After pbackfail(): get area size is "
                  << egptr() - eback() << ' '
                  << " put area size is "
                  << epptr() - pbase() << std::endl;

        if (ch == EOF)
        {
            std::cout << "pbackfail() returns EOF\n";
        }
        else
        {
            std::cout << "pbackfail() returns '"
                      << char(ch) << "'" << std::endl;
        }

        return ch;
    }
};

int main()
{
    mybuf sbuf("12345"); // 读写流

    sbuf.sungetc();
    std::cout << std::endl;
    sbuf.sputbackc('5');
    return 0;
}

输出

 

后附字符到输出序列

std::basic_stringbuf<CharT,Traits,Allocator>::overflow

protected:
virtual int_type overflow ( int_type c = Traits::eof() );

后附字符 c 到输出字符序列。

c 为文件尾指示器( traits::eq_int_type(c,traits::eof()) == true ),则不后附字符。函数不做任何操作并返回异于 traits::eof() 的未指定值。

否则,若输出序列拥有可用写位置,或若此函数成功令一个写位置可用,则调用 sputc(c) 并返回 c

若 stringbuf 为输出打开( mode & ios_base::out) != 0 ),则此函数能令写位置可用:此情况下,它重分配(或在最初分配)足够大的缓冲区,以保有整个当前缓冲区加上至少一个字符。若 stringbuf 亦为输入打开( (mode & ios_base::in) != 0 ),则 overflow 亦会通过移动 egptr() 到指向恰好越过新放置区的位置,来增加获取区的大小。

参数

c-要存储于放置区的字符

返回值

若失败则为指示失败的 Traits::eof() 。若成功后附字符 c 则为 c 。或若以 Traits::eof() 为参数调用,则为某异于 Traits::eof() 的值。

注意

此函数异于典型的 overflow() ,后者移动缓冲区的内容到关联字符序列,因为 std::basic_stringbuf 的缓冲区和关联序列是同一序列。

调用示例

#include <sstream>
#include <string>
#include <iostream>

//  typedef basic_stringbuf<char> 	stringbuf;
struct mybuf : std::stringbuf
{
    mybuf(const std::string& new_str,
          std::ios_base::openmode which =
              std::ios_base::in | std::ios_base::out)
        : std::stringbuf(new_str, which) {}

    int_type overflow(int_type c = EOF) override
    {
        std::cout << "stringbuf::overflow('"
                  << char(c) << "') called" << std::endl
                  << "Before: size of get area: "
                  << egptr() - eback() << std::endl
                  << "        size of put area: "
                  << epptr() - pbase() << std::endl;

        int_type ret = std::stringbuf::overflow(c);

        std::cout << "After : size of get area: "
                  << egptr() - eback() << std::endl
                  << "        size of put area: "
                  << epptr() - pbase() << std::endl;

        return ret;
    }
};

int main()
{
    std::cout << "read-write stream:" << std::endl;
    mybuf sbuf("   "); // 只读流
    std::iostream stream(&sbuf);
    stream << 1234;
    std::cout << sbuf.str() << std::endl;

    std::cout << std::endl << "read-only stream:" << std::endl;
    mybuf ro_buf("   ", std::ios_base::in); // 只读流
    std::iostream ro_stream(&ro_buf);
    ro_stream << 1234;

    std::cout << std::endl << "write-only stream:" << std::endl;
    mybuf wr_buf("   ", std::ios_base::out); // 只写流
    std::iostream wr_stream(&wr_buf);
    wr_stream << 1234;

    return 0;
}

 输出

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:21-40)

第21题 在广播类型网络中,DIS默认发送Hello时间间隔为多少? A、10s B、3.3s C、5S D、40s 答案&#xff1a;B 解析&#xff1a; 在广播环境中,DIS 发送 hello 报文的周期更加的短,是普通ISIS路由器的1/3,普通ISIS路由器发送hello的时间为10s,所以DIS发送hello的周期是3.3s …

vue3新建的项目如何配置

如何创建vue项目链接&#xff1a;http://t.csdn.cn/tX8wY 点击src删除一些没有用的东西 首先查看node_modules文件夹有没有pnpm文件夹&#xff0c;有的话删除node_modules文件夹 重新使用npm i进行安装 在APP.vue下面删除无用代码 删除前 删除后 在views下面找到Home首页删…

用大模型“介绍如何用不同的编程语言编写出七夕的爱情感觉”

前言 七夕是中国传统的情人节&#xff0c;也是向心爱的人表达情感的好时机。而今&#xff0c;技术发展日新月异&#xff0c;让我们一起用创意和技术的力量来营造浪漫的氛围吧&#xff01; 在这篇博客文章中&#xff0c;我将向您展示如何用大模型去实现。 文心一言 Python编程…

LeetCode863. 二叉树中所有距离为 K 的结点(相关话题:深度遍历,广度遍历)

题目描述 给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。 返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。 示例 1: 输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, k = 2 输出:[7,4,1] 解释…

【【萌新的STM32学习-13之GPIO寄存器的用法】】

萌新的STM32学习-13之GPIO寄存器的用法 从外部来看我们有很多个GPIO 分为ABCDEF等等 每个GPIO都有&#xff11;&#xff16;个引脚 每个引脚的名字是PA&#xff10;到PA&#xff11;&#xff15; 这是外部的看法 对于内部 引脚自然会有引脚的功能传入的模式 状态 频率 等…

fatal: not a git repository (or any of the parent directories): .git

提示说没有.git这样一个目录 在命令行 输入 git init 然后回车就好了 git remote add origin https:/.git git push -u origin "master"

通达信指标公式13:涨跌星期密码升级2.0

★★★★★博文原创不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习小技巧&#xff0c;喜欢的老铁可以多多帮忙点赞&#xff0c;小红牛在此表示感谢&#xff0c;就是对作者的最大支持。愿与诸君共勉&#xff0c;悟道于股市★★★★★…

excel文本函数篇2

本期主要介绍LEN、FIND、SEARCH以及后面加B的情况&#xff1a; &#xff08;1&#xff09;后缀没有B&#xff1a;一个字节代表一个中文字符 &#xff08;2&#xff09;后缀有B&#xff1a;两个字节代表一个中文字符 1、LEN(text)&#xff1a;返回文本字符串中的字符个数 2、…

【QT】progressBar的使用(13)

progressBar多用于记录程序运行的时间、文件下载的时间等等&#xff0c;今天就来看一下&#xff0c;如何熟练运用progressBar。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&#xff1a;Download Python | Python.org 2.QT Designer 官方下载路径&#xff1a;Qt…

三维模型OSGB格式轻量化的跨平台兼容性技术分析

三维模型OSGB格式轻量化的跨平台兼容性技术分析 在三维模型应用中&#xff0c;OSGB格式轻量化处理是一种常见的技术手段&#xff0c;可以通过数据压缩、简化、滤波等操作&#xff0c;降低三维模型数据的存储空间和传输带宽需求&#xff0c;提高应用程序的性能和用户体验。但是&…

UaExpert使用教程

1.安装好UaExpert后&#xff0c;填写下列信息 2.使用UaExpert作为client连接server&#xff08;server可使用KEPServerEX 模拟服务端&#xff0c;或自己搭建一个测试服务&#xff0c;测试服务搭建代码点击获取&#xff09; 点击“”号 填写配置名称&#xff0c;双击Custom …

APP外包开发需要注意的问题

在开发APP时&#xff0c;有许多问题需要注意&#xff0c;以确保应用的质量、安全性和用户体验。以下是一些常见的APP开发需要注意的问题&#xff0c;以及相应的解决方案&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0…

uniapp-滑块验证组件wo-slider

wo-slider是一款支持高度自定义的滑块验证组件&#xff0c;采用uniapp-vue2编写 采用touchstart、touchmove、touchend事件实现的滑块组件,支持H5、微信小程序&#xff08;其他小程序未试过&#xff0c;可自行尝试&#xff09; 可到插件市场下载尝试&#xff1a; https://ext.…

Swift 周报 第三十五期

文章目录 前言新闻和社区五天市值蒸发 2000 亿美元&#xff0c;苹果公司怎么了&#xff1f;在你的 App 中帮助顾客解决账单问题需要声明原因的 API 列表现已推出 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十五…

算法通关村十二关 | 字符串转换

1. 转换小写字母 LeetCode709&#xff1a;给你一个字符串s&#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。 每个字母都是有确定的ASCII的&#xff0c;可以根据码表操作子字符串&#xff0c;常见的ASCII范围是&#xff1a; a-z: 97-122, …

LeetCode算法心得——k-avoiding 数组的最小总和(标记数组)

大家好&#xff0c;我是晴天学长&#xff0c;这是一个细节题和一部分的思维题哈&#xff01; 2) .算法思路 k-avoiding 数组的最小总和 1,填充一个1到n 的Boolean的数组 要n个数&#xff0c;但是数组大小不能确定。 所以建立1000的大小。 2.遍历筛选&#xff0c;如果数组中有这…

中型敏捷GenAI模型:面向企业垂直领域应用的实用型AI

编者按&#xff1a;人工智能领域近年来模型规模不断增大&#xff0c;参数规模爆炸式增长。从 GPT-3 的 1,750 亿&#xff0c;再到传闻中的 GPT-4 可能高达惊人的 18,000 亿参数。然而&#xff0c;随着模型规模的不断膨胀&#xff0c;也出现了训练成本高昂、环境影响大、应用部署…

使用fdisk分区时,确实创建了一个分区,但是这个分区似乎并没有被Linux系统识别解决方法

使用fdisk分区时&#xff0c;确实创建了一个分区&#xff0c;但是这个分区似乎并没有被Linux系统识别解决方法 故障现象描述 这是我的sdb硬盘我想给他扩展一个分区sdb4 我开始扩展硬盘 似乎没用什么太大的问题也同步到磁盘了使用lsblk查看一下分区情况 系统并没有扫描到sdb4这…

Linux安装Net7SDK运行Net项目

安装Net7 SDK 1.安装sdk依赖环境 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb2.安装 SDK sudo apt-get update &…

Grafana 安装配置教程

Grafana 安装配置教程 一、介绍二、Grafana 安装及配置2.1 下载2.2 安装2.2.1 windows安装 - 图形界面2.2.2 linux安装 - 安装脚本 三、Grafana的基本配置3.1 登录3.2 Grafana设置中文 四、grafana基本使用 一、介绍 Grafana是一个通用的可视化工具。对于Grafana而言&#xff0…