当前位置: 首页 > news >正文

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

定义于头文件 <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>::setbuf

protected:
virtual std::basic_streambuf<CharT, Traits>* setbuf( char_type* s, std::streamsize n )

s 为空指针且 n 为零,则此函数无效果。

否则,效果是实现定义的:一些实现不做任何事,而一些实现清空当前用作缓冲区的 std::string 成员,并开始以用户提供的大小为 n ,首元素为 s 所指向的字符数组,为输入/输出字符序列的缓冲区。

此函数为受保护虚,仅可通过 pubsetbuf() 或导出自 std::basic_stringbuf 的用户定义类的成员函数调用它。

参数

s-指向用户提供缓冲区首个 CharT 的指针或空指针
n-用户提供缓冲区中的 CharT 元素数或零

返回值

this 。

注意

弃用的流缓冲 std::strstreambuf 或 boost.IOStreams 设备 boost::basic_array 可用于以可移植方式实现用户提供的字符数组上的 I/O 缓冲。

调用示例

#include <sstream>
#include <string>
#include <iostream>int main()
{std::stringbuf sbuf;char c[1024] = {};sbuf.pubsetbuf(c, 1024);std::iostream stream(&sbuf);stream << 3.14 << std::endl;std::cout << c << std::endl;return 0;
}

输出

 

用相对寻址,重定位输入序列、输出序列或两者中的下一位置指针

std::basic_stringbuf<CharT,Traits,Allocator>::seekoff
protected:

virtual pos_type seekoff(off_type off,
                         ios_base::seekdir dir,

                         ios_base::openmode which = ios_base::in | ios_base::out);

若可能,则重寻位 std::basic_streambuf::gptr 和/或 std::basic_streambuf::pptr 到对应距流的获取和/或放置区起始、结尾或当前位置准确 off 个字符的位置。

  • which 包含 ios_base::in 而此缓冲为读取打开(即 ((which & ios_base::in) == ios_base::in ),则重寻位获取区内的读指针 std::basic_streambuf::gptr 如后述
  • which 包含 ios_base::out 而此缓冲为写入打开(即 (which & ios_base::out) == ios_base::out ),则重寻位放置区内的写指针 std::basic_streambuf::pptr 如后述
  • which 包含 ios_base::inios_base::out 两者而缓冲为读和写打开( (which & (ios_base::in|ios_base::out)) ==(ios_base::in|ios_base::out) )而 dir 为 ios_base::beg 或 ios_base::end 之一,则重寻位读和写指针如后述。
  • 否则,此函数失败。

若重寻位( gptrpptr 或两者),则按下列方式进行:

1) 若要重寻位的指针为空指针且新偏移 newoff 会为非零,则函数失败。

2) 确定 off_type 类型的新指针偏移 newoff

a) 若 dir == ios_base::beg ,则 newoff 为零

b) 若 dir == ios_base::cur ,则 newoff 为指针的当前位置( gptr()-eback() 或 pptr()-pbase() )

c) 若 dir == ios_base::end ,则 newoff 为缓冲区的整个已初始化部分的长度(若使用过分配,则为高水位指针减起始指针)

3) 若 newoff + off < 0 (重寻位会移动指针到缓冲区的起始指针之前)或若 newoff + off 会指向缓冲区结尾后(或若使用过分配,则为缓冲区中最后未初始化字符之后),则函数失败

4) 否则,如同以 gptr() = eback() + newoff + off 或 pptr() = pbase() + newoff + off 赋值指针。

参数

off-要设置下一位置指针到的相对位置
dir-定义应用偏移到的基位置。它能为下列常量之一:
常量解释
beg流的开始
end流的结尾
cur流位置指示器的当前位置
which-定义影响的是输入序列、输出序列还是两者。它能为下列常量之一或其组合:
常量解释
in影响输入序列
out影响输出序列

返回值

成功时为 pos_type(newoff) ,失败时或若 pos_type 不能表示结果流位置则为 pos_type(off_type(-1)) 。

 调用示例

#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) {}pos_type tellp(){char ch = *pptr();return ch;}pos_type tellg(){char ch = *gptr();return ch;}};int main()
{mybuf sbuf("123"); // 入/出std::cout << "put pos = " << sbuf.tellp()<< " get pos = " << sbuf.tellg() << std::endl;// 两个指针绝对寻位sbuf.pubseekoff(1, std::ios_base::beg); // 都前移 1std::cout << "put pos = " << sbuf.tellp()<< " get pos = " << sbuf.tellg() << std::endl;// 试图从当前位置前移两个指针 1if (-1 == sbuf.pubseekoff(1, std::ios_base::cur)){std::cout << "moving both pointers from current position failed\n";}std::cout << "put pos = " << sbuf.tellp()<< " get pos = " << sbuf.tellg() << std::endl;// 前移写指针 1 ,但不前移读指// can also be called as ss.seekp(1, std::ios_base::cur);sbuf.pubseekoff(1, std::ios_base::cur, std::ios_base::out);std::cout << "put pos = " << sbuf.tellp()<< " get pos = " << sbuf.tellg() << std::endl;sbuf.sputc('a'); // 写入输出位置std::cout << "Wrote 'a' at put position, the buffer is now "<< sbuf.str() << std::endl;char ch = sbuf.sgetc();std::cout << "reading at get position gives '"<< ch << "'" << std::endl;return 0;
}

输出

 

相关文章:

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

定义于头文件 <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_stringbu…...

iceberg系列之 hadoop catalog 小文件合并实战

背景 flink1.15 hadoop3.0pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mave…...

神经网络基础-神经网络补充概念-25-深层神经网络

简介 深层神经网络&#xff08;Deep Neural Network&#xff0c;DNN&#xff09;是一种具有多个隐藏层的神经网络&#xff0c;它可以用来解决复杂的模式识别和特征学习任务。深层神经网络在近年来的机器学习和人工智能领域中取得了重大突破&#xff0c;如图像识别、自然语言处…...

MySQL— 基础语法大全及操作演示!!!(上)

MySQL—— 基础语法大全及操作演示&#xff08;上&#xff09; 一、MySQL概述1.1 、数据库相关概念1.1.1 MySQL启动和停止 1.2 、MySQL 客户端连接1.3 、数据模型 二、SQL2.1、SQL通用语法2.2、SQL分类2.3、DDL2.3.1 DDL — 数据库操作2.3.1 DDL — 表操作 2.4、DML2.4.1 DML—…...

[golang gin框架] 46.Gin商城项目-微服务实战之后台Rbac客户端调用微服务权限验证以及Rbac微服务数据库抽离

一. 根据用户的权限动态显示左侧菜单微服务 1.引入 后台Rbac客户端调用微服务权限验证功能主要是: 登录后显示用户名称、根据用户的权限动态显示左侧菜单,判断当前登录用户的权限 、没有权限访问则拒绝,参考[golang gin框架] 14.Gin 商城项目-RBAC管理,该微服务功能和上一节[g…...

域名和ip的关系

域名和ip的关系 一&#xff1a;什么是域名 域名&#xff0c;简称域名、网域&#xff0c;是由一串用点分隔的名字组成的上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时标识 计算机的电子方位(有时也指地理位置)。网域名称系统&#xff0c;有时也简称为域名…...

excel日期函数篇1

1、DAY(serial_number)&#xff1a;返回序列数表示的某月的天数 在括号内给出一个时间对象或引用一个时间对象&#xff08;年月日&#xff09;&#xff0c;返回多少日 下面结果都为20 2、MONTH(serial_number)&#xff1a;返回序列数表示的某年的月份 在括号内给出一个时间对…...

Leetcode151 翻转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随空格…...

PHP FTP的相关函数及简单使用示例

简介 FTP是ARPANet的标准文件传输协议&#xff0c;该网络就是现今Internet的前身。 PHP FTP函数是通过文件传输协议提供对文件服务器的客户端访问&#xff0c;FTP函数用于打开、登陆以及关闭连接&#xff0c;也用于上传、下载、重命名、删除以及获取服务器上文件信息。 安装 …...

高光谱 | 矿物识别和分类标签数据制作、农作物病虫害数据分类、土壤有机质含量回归与制图、木材含水量评估和制图

本课程提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本课程涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心&#xff0c;用通俗易懂的语言解释高光谱的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。方法篇结合Python编程工具&#xff0c;…...

【数据结构】二叉树篇| 纲领思路01+刷题

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 所谓自由&#xff0c;不是随心所欲&#xff0c;而是自我主宰。——康德 目录 一、二叉树刷题纲领二、刷题1、104. 二叉树的最大深度2、 二叉…...

系统架构设计师---计算机基础知识之数据库系统结构与规范化

目录 一、基本概念 二、 数据库的结构 三、常用的数据模型 概念数据模型...

PyCharm连接Docker中的容器(ubuntu)

一、为什么要用Pycharm链接Docker中的ubuntu 因为在进行深度学习的时候&#xff0c;基于windows系统在开发的过程中&#xff0c;老是出现很多问题&#xff0c;大多数是环境问题。 尽管安装了Conda&#xff0c;也不能很好的解决问题&#xff0c;使用ubuntu是最好的选择。 二、…...

安防视频汇聚平台EasyCVR视频监控综合管理平台H.265转码功能更新,新增分辨率配置的具体步骤

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…...

全平台数据(数据库)管理工具 DataCap 管理 Rainbond 上的所有数据库

DataCap是用于数据转换、集成和可视化的集成软件&#xff0c;支持多种数据源、文件类型、大数据相关数据库、关系数据库、NoSQL数据库等。通过该 DataCap 可以实现对多个数据源的管理&#xff0c;对数据源下的数据进行各种操作转换&#xff0c;制作数据图表&#xff0c;监控数据…...

“深入探究JVM内部机制:从字节码到实际执行“

标题&#xff1a;深入探究JVM内部机制&#xff1a;从字节码到实际执行 摘要&#xff1a;本文将深入探究Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;从字节码的生成、类加载、字节码解释和即时编译等环节&#xff0c;详细介绍JVM是如何将Java程序的字节码转化…...

C++写文件,直接写入结构体

C写文件&#xff0c;直接写入结构体 以前写文件都是写入字符串或者二进制再或者就是一些配置文件&#xff0c;今天介绍一下直接写入结构体&#xff0c;可以在软件参数较多的时候直接进行读写&#xff0c;直接将整个结构体写入和读取&#xff0c;看代码&#xff1a; #include&…...

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

目录 前言阅读准备阅读指引阅读建议 课程内容一、依赖注入方式&#xff08;前置知识&#xff09;1.1 手动注入1.2 自动注入1.2.1 XML的autowire自动注入1.2.1.1 byType&#xff1a;按照类型进行注入1.2.1.2 byName&#xff1a;按照名称进行注入1.2.1.3 constructor&#xff1a;…...

线程|线程的使用、四种实现方式

1.线程的实现方式 1.用户级线程 开销小&#xff0c;用户空间就可以创建多个。缺点是&#xff1a;内核无法感知用户级多个线程的存在&#xff0c;把其当作只有一个线程&#xff0c;所以只会提供一个处理器。 2.内核级线程 相对于用户级开销稍微大一点&#xff0c;可以利用多…...

Facebook 应用未启用:这款应用目前无法使用,应用开发者已得知这个问题。

错误&#xff1a;Facebook 应用未启用:这款应用目前无法使用&#xff0c;应用开发者已得知这个问题。应用重新启用后&#xff0c;你便能登录。 「应用未经过审核或未发布」&#xff1a; 如果一个应用还没有经过Facebook的审核或者开发者尚未将应用发布&#xff0c;那么它将无法…...

(十八)大数据实战——Hive的metastore元数据服务安装

前言 Hive的metastore服务作用是为Hive CLI或者Hiveserver2提供元数据访问接口。Hive的metastore 是Hive元数据的存储和管理组件&#xff0c;它负责管理 Hive 表、分区、列等元数据信息。元数据是描述数据的数据&#xff0c;它包含了关于表结构、存储位置、数据类型等信息。本…...

ubuntu 22.04 LTS 在 llvm release/17.x 分支上编译 cookbook llvm example Chapter 02

一&#xff0c;从源码编译 llvm 下载源码&#xff1a; $ git clone https://github.com/llvm/llvm-project.git 创建 对应 commit id分支&#xff1a; $ cd llvm-project $ git checkout 5b78868661f42a70fa30 -b 17.x.greater 源码成功编译 llvm-project commit id&…...

【仿写tomcat】三、通过socket读取http请求信息

仿写tomcat 建立Socket连接获取连接信息查看HTTP信息 建立Socket连接 这里我们也是创建一个专门管理socket的类 package com.tomcatServer.socket;import java.io.*; import java.net.ServerSocket;/*** 套接字存储** author ez4sterben* date 2023/08/15*/ public class Soc…...

Hive的窗口函数与行列转换函数及JSON解析函数

1. 系统内置函数 查看系统内置函数&#xff1a;show functions ; 显示内置函数的用法&#xff1a; desc function lag; – lag为函数名 显示详细的内置函数用法: desc function extended lag; 1.1 行转列 行转列是指多行数据转换为一个列的字段。 Hive行转列用到的函数 con…...

CSS中的z-index属性有什么作用?如何控制元素在层叠上下文中的显示顺序?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ z-index 属性的作用及控制元素层叠顺序作用 ⭐ 控制元素层叠顺序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff0…...

c语言——字符转ASCLL码

//字符转ASCLL码 #include<stdio.h> #include<stdlib.h> int main() {char c;printf("输入字符&#xff1a;");scanf("%c",&c);printf(" %c 的ASCLL为: %d \n",c,c);system("pause");return 0;}...

ardupilot开发 --- 安装与调参篇

解锁电机前的安全检查 Pre-arm Safety Checks 安全检查包括&#xff1a;是否未校准、配置或传感器数据是否正确等等&#xff0c;某一项不通过则不允许解锁电机&#xff1b; 目的&#xff1a;防止炸机&#xff1b; 如何禁用这些安全检查&#xff1f;配置 ARMING_CHECK&#xff…...

BC108 矩阵交换

描述 KiKi有一个矩阵&#xff0c;他想知道经过k次行变换或列变换后得到的矩阵。请编程帮他解答。 输入描述 第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。 (1≤n≤10,1≤m≤10) 从2到n1行&#xff0c;每行输入m个整数&#xff08;范围-…...

如何发现系统改进点,优化点,提高点,新系统 边界感不要太强

技术人员规划能力&#xff0c;如何规划新的系统_技术规划能力_个人渣记录仅为自己搜索用的博客-CSDN博客 1. 协作中, 双方系统对接, 边界感不要太强. 肯定会不爽, 不爽的点里可以挖掘改进点 肯定会有很多冲突,对方技能欠缺, 对方耽误你的时间, 可以想下有没有什么方案是可…...

5G无人露天矿山解决方案

1、5G无人露天矿山解决方案背景 ①2010.10&#xff0c;国家安监总局《金属非金属地下矿山安全避险“六大系统”安装使用和监督检查暂行规定》 ②2016.03&#xff0c;国家发改委《能源技术革命创新行动计划&#xff08;2016-2030&#xff09;》&#xff0c;2025 年重点煤矿区采…...