c++11 标准模板(STL)(std::basic_streambuf)(八)

news2024/11/20 16:30:41
定义于头文件 <streambuf>
template<

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

> class basic_streambuf;

 类 basic_streambuf 控制字符序列的输入与输出。它包含下列内容并提供到它们的访问:

1) 受控制字符序列,又称为缓冲区,它可含有为输入操作缓冲的输入序列(又称为获取区),和/或为输出操作缓冲的输出序列(又称为放置区)。

2) 关联字符序列,又称作(对于输入)或(对于输出)。它可以是通过 OS API 访问的实体(文件、 TCP 接头、串行端口、其他字符设备),或者可以是能转译成字符源或池的对象( std::vector 、数组、字符串字面量)。

I/O 流对象 std::basic_istream 及 std::basic_ostream ,还有所有导出自它们的对象( std::ofstream 、 std::stringstream 等),都完全以 std::basic_streambuf 实现。

受保护成员函数

放置区

将多个字符写到输出序列

std::basic_streambuf<CharT,Traits>::sputn, 
std::basic_streambuf<CharT,Traits>::xsputn

std::streamsize sputn( const char_type* s, std::streamsize count );

(1)

protected:
virtual std::streamsize xsputn( const char_type* s, std::streamsize count );

(2)

1) 调用最终导出类的 xsputn(s, count)

2) 从首元素为 s 所指向的数组写 count 个字符到输出序列。如同以重复调用 sputc() 写入字符。在写入 count 字符后或调用 sputc() 会返回 Traits::eof() 时写入停止。

若放置区变满( pptr() == epptr() ),则此函数可调用 overflow() ,或以其他未指定手段达成调用 overflow() 的效果。

参数

(无)

返回值

成功写入的字符数。

注意

“以未指定手段达成 overflow() 的效果”容许无中间缓冲的大量 I/O :这是一些 iostream 的实现中, std::ofstream::write 简单地传递指针给 POSIX write() 系统调用的缘由。

 调用示例

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream s1;
    std::streamsize sz = s1.rdbuf()->sputn("This is a test", 14);
    s1 << '\n';
    std::cout << "The call to sputn() returned " << sz << '\n'
              << "The output sequence contains " << s1.str();

    std::istringstream s2;
    sz = s2.rdbuf()->sputn("This is a test", 14);
    std::cout << "The call to sputn() on an input stream returned " << sz << '\n';
}

输出

从放置区写入字符到关联的输出序列

std::basic_streambuf<CharT,Traits>::overflow

virtual int_type overflow( int_type ch = Traits::eof() );

通过保存始于 pbase() 的某个起始字符子序列到输入序列,并更新放置区(若需要),确保放置区有至少一个字符的空间。若 ch 不是 Traits::eof() (即 Traits::eq_int_type(ch, Traits::eof()) != true ),则将它放到放置区或直接保存到输出序列。

函数可以更新 pptrepptrpbase 指针以定义要写入更多数据的位置。失败时,函数确保 pptr() == nullptr 或 pptr() == epptr 。

函数的基类版本不做任何事。允许此函数的导出类版本在耗尽的情况下更新放置区。

参数

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

返回值

成功时返回不等于 Traits::eof() 的未指定值,失败时返回 Traits::eof() 。

此函数的基类版本返回 Traits::eof() 。

注意

sputc() 和 sputn() 在可能上溢的情况( pptr() == nullptr 或 pptr() >= epptr() )下调用此函数。

调用示例

#include <iostream>
#include <array>

// 以 std::array 实现的 std::ostream 缓冲区
template<std::size_t SIZE, class CharT = char>
class ArrayedStreamBuffer : public std::basic_streambuf<CharT>
{
public:

    using Base = std::basic_streambuf<CharT>;
    using char_type = typename Base::char_type;
    using int_type = typename Base::int_type;

    ArrayedStreamBuffer() : buffer_{} // 值初始化 buffer_ 为全零
    {
        Base::setp(buffer_.begin(), buffer_.end()); // 设置 std::basic_streambuf
        // 放置区指针以 'buffer_' 工作
    }

    int_type overflow(int_type ch)
    {
        std::cout << "overflow\n";
        return Base::overflow(ch);
    }

    void print_buffer()
    {
        for (const auto& i : buffer_)
        {
            if (i == 0)
            {
                std::cout << "NULL";
            }
            else
            {
                std::cout << i;
            }
            std::cout << " ";
        }
        std::cout << "\n";
    }

private:
    std::array<char_type, SIZE> buffer_;
};

int main()
{
    ArrayedStreamBuffer<10> streambuf;
    std::ostream stream(&streambuf);

    stream << "hello";
    streambuf.print_buffer();
    if (stream.good())
    {
        std::cout << "stream is good\n";
    }

    stream << "world";
    streambuf.print_buffer();
    if (stream.good())
    {
        std::cout << "stream is good\n";
    }

    stream << "!";
    streambuf.print_buffer();
    if (!stream.good())
    {
        std::cout << "stream is not good\n";
    }
}

 输出

返回指向放置区的起始、当前字符和末尾的指针

std::basic_streambuf<CharT,Traits>::pbase, 
std::basic_streambuf<CharT,Traits>::pptr, 
std::basic_streambuf<CharT,Traits>::epptr

char_type* pbase() const;

(1)

char_type* pptr() const;

(2)

char_type* epptr() const;

(3)

返回定义放置区的指针。

1) 返回指向放置区起始(“基”)的指针。

2) 返回指向放置区中当前字符的指针(放置指针)。

3) 返回指向放置区结尾后一位置的指针。

参数

(无)

返回值

1) 指向放置区起始的指针。

2) 指向放置区中当前字符的指针(放置指针)。

3) 指向放置区结尾后一位置的指针。

令输出序列中的下一位置指针前进

std::basic_streambuf<CharT,Traits>::gbump

void gbump( int count );

 跳过获取区中的 count 个字符。通过令获取指针前进 count 个字符。不为下溢做检查。

参数

count-要跳过的字符数

返回值

(无)

注意

因为此函数接收 int ,故它无法操纵大于 std::numeric_limits<int>::max() 字符的缓冲区( LWG 255 )。

重定位输出序列的起始、下一位置和终止指针

std::basic_streambuf<CharT,Traits>::setp

void setp( char_type* pbeg, char_type* pend );

设置定义放置区的指针值。特别是调用后 pbase() == pbeg 、 pptr() == pbeg 、 epptr() == pend 。

参数

pbeg-指向放置区新起始的指针
pend-指向放置区新结尾的指针

返回值

(无)

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

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

相关文章

hadoop-hdfs分布式文件系统理论(一)

为什么要开发HDFS分布式文件系统 可以更好的支持分布式计算。 hadoop distribute file system是一个分布式 文件系统&#xff0c;操作的是文件&#xff0c;增、删都是以文件为单位。 存储模型 文件线性按字节切割成块&#xff08;block&#xff09;&#xff0c;具有offset&a…

驱动开发:取进程模块的函数地址

在笔者上一篇文章《驱动开发&#xff1a;内核取应用层模块基地址》中简单为大家介绍了如何通过遍历PLIST_ENTRY32链表的方式获取到32位应用程序中特定模块的基地址&#xff0c;由于是入门系列所以并没有封装实现太过于通用的获取函数&#xff0c;本章将继续延申这个话题&#x…

【UE5 Cesium】03-Cesium for Unreal 添加本地数据集

上一篇&#xff1a;【UE5 Cesium】02-Cesium for Unreal 添加在线数据集 步骤 1. 在官网&#xff08;Adding Datasets – Cesium&#xff09;上下载一个示例 下载的是一个名为“Tileset.zip”的压缩文件 解压后文件内容如下 2. 打开虚幻编辑器&#xff0c;点击“Blank 3D Tiles…

macOS Ventura 13.5beta4(22G5059d)发布

系统介绍 黑果魏叔 6 月 28 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 4 更新&#xff08;内部版本号&#xff1a;22G5059d&#xff09;&#xff0c;本次更新距离上次发布隔了 12 天。 macOS Ventura 带来了台前调度、连续互通相机、F…

Spring Boot + Vue3前后端分离实战wiki知识库系统<九>--文档管理功能开发一

接着Spring Boot Vue3前后端分离实战wiki知识库系统&#xff1c;八&#xff1e;--分类管理功能开发二继续往下&#xff0c;这次咱们则来到文档管理功能的开发学习了&#xff0c;对于知识库的核心功能当然得是能发表文章及查看对吧&#xff0c;所以接下来一步一个脚印来完成它&…

Linux CentOS_7.9卸载Oracle适用于多版本(亲测验证)

前言&#xff1a;近期安装测评的比较多&#xff0c;在完成使命后还是可以按部就班形成个B环&#xff0c;这里主要是记录Linux卸载Oracle&#xff0c;下述方法适用于Oracle 11g&#xff0c;Oracle 12c&#xff0c;Oracle 19g版本的数据库&#xff0c;我们这边以CentOS_7.9、Orac…

C语言进阶教程(include只能包含.h文件吗?)

文章目录 前言一、include工作原理二、include只能包含.h文件吗三、include包含文件时<>和""的区别总结 前言 include在多文件编程中是非常重要的&#xff0c;我们经常使用他来包含一些头文件&#xff0c;方便我们管理代码和项目&#xff0c;那么include是只能…

《计算机系统与网络安全》 第八章 操作系统安全基础

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Linux文件的权限

1.Linux文件的权限 linux文件的权限可以分为四类&#xff1a;可读、可写、可执行、没有权限。分别用字符r、w、x、- 表示。 2. 用户与用户组 Linux是一个多用户多任务的操作系统&#xff0c;可以通过用户和用户组来更好的控制文件的权限。 每个文件都有一个拥有者&#xff08…

能在图片上涂鸦的软件有哪些?分享几种好用涂鸦工具

涂鸦可以增加趣味性。在照片上涂鸦可以增加趣味性&#xff0c;让照片更加有趣。无论是在旅行照片中添加一些有趣的涂鸦&#xff0c;还是在生活照片中添加一些幽默的涂鸦&#xff0c;都可以让照片更具有趣味性。很多小伙伴不清楚怎么在照片上进行涂鸦&#xff0c;下面给大家分享…

【JSP】使用 JSTL 增强 JSP 功能

本文仅供学习参考&#xff01; JSTL 代表 JavaServer Pages Standard Tag Library;它提供了一组核心网页功能&#xff0c;可以执行许多基本任务&#xff0c;例如结构元素的条件和迭代、操作 XML 文档以及支持国际化标记以更复杂的 SQL 元素处理。JSP以scriples而闻名&#xff0…

Apache Struts是什么?高效实现应用程序控制器

目录 一、Apache Struts是什么 二、如何使用Apache Struts 三、Apache Struts的优势和作用 一、Apache Struts是什么 Apache Struts是一个基于Java的Web应用程序框架&#xff0c;它通过MVC&#xff08;模型-视图-控制器&#xff09;体系结构来实现应用程序控制器。Struts框…

如何沉淀企业内部的知识体系?

在当今竞争激烈的商业环境下&#xff0c;企业内部的知识是一项宝贵的资产。有效地沉淀企业内部的知识体系&#xff0c;可以帮助企业提高创新能力、加强竞争优势&#xff0c;并为员工学习和发展提供良好的资源。本文将介绍如何在企业中建立和沉淀知识体系&#xff0c;以促进知识…

聊聊程序员必备的软技能——情绪管理

我之前经常提到一句话&#xff1a;大多数时候所谓的“技术之玻璃天花板”&#xff0c;其实只是缺乏软技能而已。 所以粉丝朋友们&#xff0c;我们除了需要关注技术&#xff0c;更需要注重软技能的提高。 今天写的这篇是情绪管理。 文章目录&#xff1a; 01 前言 其实我一开…

6.1.3 关于可执行文件路径的变量:$PATH

查阅文件属性的指令ls完整文件名为&#xff1a;/bin/ls&#xff08;绝对路径&#xff09;。 当我们在执行一个指令的时候&#xff0c;系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件&#xff0c;如果在PATH定义的目录中含有多个文件名为ls的可可执行…

Node框架 【Egg-企业级框架】

文章目录 &#x1f31f;前言&#x1f31f;Egg.js 是什么?&#x1f31f;Egg.js 的特性:&#x1f31f;Egg.js 的历史?&#x1f31f;Egg 继承于 Koa&#x1f31f;使用脚手架搭建项目环境&#x1f31f;环境准备&#x1f31f;搭建项目环境方式&#x1f31f;无需安装egg脚手架初始化…

大型医院安全(不良)事件报告系统源码(支持二次开发)

医院安全&#xff08;不良&#xff09;事件管理系统通过规范事件上报、流转审批、数据统计、原因分析、措施制定、效果追踪的业务流程&#xff0c;全面覆盖医院所有科室&#xff0c;利用统计工具对本院不良事件数据进行深度分析&#xff0c;查找医疗安全管理的薄弱环节&#xf…

微信小程序的跨页面传参以及data-方法的相关细节

&#x1f642;博主&#xff1a;爱学习的Akali King &#x1f642;文章核心&#xff1a;微信小程序的跨页面传参以及data-方法的相关细节 目录 前言wx.navigateTo()方法微信小程序传参的几种方式通过data-属性传参关于data-方法配合点击事件传参的细节 前言 其实在学习新东西的…

phpmyadmin弱口令至getshell 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 环境部署02 漏洞配置03 利用方式04 修复方案 01 环境部署 &#xff08;1&#xff09;phpStudy phpStudy 是一款用于进行 PHP 环境调试的程序集成软件包。在软件安装后便 启动了 MySQL 服务、Apache…

【容灾系统搭建】网络杂谈(1)之容灾系统如何搭建?

涉及知识点 什么是容灾&#xff0c;容灾系统的建设&#xff0c;容灾系统的结构模型&#xff0c;容灾平台。深入了解容灾技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知识点前言1.容灾系统…