std::istreambuf_iterator 是单趟迭代器,从用来构造它的 std::basic_streambuf 对象读取相继字符。默认构造的 std::istreambuf_iterator 迭代器被称为流尾迭代器。合法的 std::istreambuf_iterator 抵达底层流结尾时,它变得等于流尾迭代器。解引用或进一步自增它导致未定义行为。
std::ostreambuf_iterator 是单趟老式输出迭代器 (LegacyOutputIterator) ,写入相继元素到为之创建迭代器的 std::basic_streambuf 对象。实际写操作在赋值给迭代器(无论是否解引用)时进行。自增 std::ostreambuf_iterator 是无操作。典型实现中, std::ostreambuf_iterator 仅有的数据成员是指向关联 std::basic_streambuf 的指针,和指示是否抵达文件尾条件的布尔标志。

上面这段话,摘抄自 cppreference,大概意思就是说将 stream 对象转成迭代器iterator,并把缓冲区的数据读入或读出到 iterator中。

  • 输入流缓冲区迭代器istreambuf_iterator从输入流缓冲区中读取字符。
  • 输出流缓冲区迭代器ostreambuf_iterator将字符写入到缓冲区

输入流缓冲区迭代器istreambuf_iterator功能很强大,可以从 istream、ifstream、istringstream中一次性读取所有字符内容,包括空格、tab等等空白特殊字符。istreambuf_iterator模板参数只能是char和wchar_t类型,因为它的构造函数参数是basic_streambuf和basic_istream类型的,而从这2个模板类派生的子类,默认就那几个。如果模板参数是wchar_t类型,那么上面提到的几个流,也应该使用wistream、wifstream、wistringstream版本的,要保持类型一致

istreambuf_iterator例子:

//从字符串流中读数据
std::istringstream iss("abcdefg");
std::string str((std::istreambuf_iterator<char>(iss)), std::istreambuf_iterator<char>());
std::cout << str << '\n';//从文件流中读数据
std::ifstream ifs("a.txt");
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
std::cout << str << '\n';//从文件流中读数据,并放到容器中
std::ifstream ifs("a.txt");
std::vector<char> vc((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());//是迭代器,并且也重载了 ++和* 操作符
std::ifstream ifs("a.txt");
std::vector<char> vc;
std::istreambuf_iterator beg{ifs},end;
for(;beg!=end;++beg)
{vc.push_back(*beg);
}

ostreambuf_iterator例子:

//写到文件
std::ofstream ofs("E:\\2.txt");
std::ostreambuf_iterator<char> ofsBeg{ ofs };
*ofsBeg++ = 'a';
*ofsBeg++ = 'b';
*ofsBeg++ = 'c';
*ofsBeg++ = 'd';
ofs.close();

在上面的例子中,看到 std::istreambuf_iterator 的写法很奇怪,要多加一个括号,具体解释请看这些博客:

https://www.zhihu.com/question/42789717/answer/94767165

https://blog.csdn.net/tax10240809163com/article/details/120856304

https://www.cnblogs.com/yangyingchao/p/3394146.html

https://qa.1r1g.com/sf/ask/881303531/

不过上面的解释,似懂非懂,解释的有些牵强。

其实,最重要的几句话就是“因为没有括号,编译器会将其视为函数声明” “这是C++的一个设计缺陷:没有给函数声明提供一个专门的关键字,于是经常会混淆函数声明与对象初始化。

所以针对这些歧义,大家给出的解决方式就是:1. 声明变量后再当做参数使用;2. 采用c++11新增的方式来初始化变量:

//提前声明变量,再传进去
std::istringstream iss("abcdefg");
std::istreambuf_iterator<char> beg(iss),end; //2个变量也可以分别声明
std::string str(beg, end);
std::cout << str << '\n';//采用{}方式声明
std::istringstream iss("abcdefg");
std::string str{std::istreambuf_iterator<char>(iss),std::istreambuf_iterator<char>()};
std::cout << str << '\n';//采用{}方式声明
std::istringstream iss("abcdefg");
std::string str(std::istreambuf_iterator<char>{iss}, std::istreambuf_iterator<char>{});
std::cout << str << '\n';

这边博客可以参考:https://www.cnblogs.com/cscshi/p/15701422.html

istreambuf_iterator和ostreambuf_iterator用法简单总结相关推荐

  1. velocity用法简单实例说明 .

    http://blog.csdn.net/renxianzuo/article/details/4457381 2009-08-18 01:48 3516人阅读 评论(8) 收藏 举报 velocit ...

  2. python timer怎么用_python定时器(Timer)用法简单实例

    python定时器(Timer)用法简单实例 本文实例讲述了python定时器(Timer)用法.分享给大家供大家参考.具体如下: # encoding: UTF-8 import threading ...

  3. HTML5 autofocus属性用法简单介绍

    本章节简单介绍一下HTML5中新增的一个属性autofocus,它可以让一个元素加载后获取焦点,在此之前一般要通过使用javascript的focus()方法实现我们的要求,非常的简单,代码如下: 1 ...

  4. tf.nn.sampled_softmax_loss用法简单介绍

    tf.nn.sampled_softmax_loss用法简单介绍 在研究Skip-gram模型时遇到了采用方式的softmax,一时没有搞明白,下面做个小案例试一下. tf.nn.sampled_so ...

  5. MAPSTRUCT(@Mapper用法)简单介绍

    MAPSTRUCT(@Mapper用法) 官网地址:http://mapstruct.org/ MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个 ...

  6. xilinx oddr idelay用法简单介绍

    我们知道xilinx FPGA的selectio中有ilogic和ologic资源,可以实现iddr/oddr,idelay和odelay等功能.刚入门时可能对xilinx的原语不太熟练,在vivad ...

  7. Oracle-exists用法简单搞懂

    Exists用法可能不太好理解,今天帮助大家简单搞懂 示范语句 使用exists: select * from T1 where exists(select 1 from T2 where T1.a= ...

  8. kindeditor用法简单介绍

    最近做毕业设计用了一个叫做kindeditor的文本编辑工具,相信很多人都用过,这货和fckeditor差不多,个人感觉这个的皮肤更好看,而且对中文的支持更好,没那么容易出现中文乱码问题.下次记录一下 ...

  9. php面向对象程序设计,PHP面向对象程序设计类的定义与用法简单示例

    本文实例讲述了PHP面向对象程序设计类的定义与用法.分享给大家供大家参考,具体如下: class Person { private $name; private $sex; private $age; ...

最新文章

  1. Java数据结构与算法(八)-二叉树
  2. Linux系统上的文件类型
  3. mft按钮设计_奥林巴斯M4/3系统新品激情再燃 以轻量化设计铸就微单极致体验
  4. window document树
  5. kbengine0.2.3发布,开源分布式游戏服务端引擎
  6. matlab教程点语言,编程语言 / Matlab教程_电脑教程学习网( 5 )
  7. 开发者说PaddleOCR的.NET封装与应用部署
  8. 洛谷P1120小木棒 爆搜+剪枝
  9. cherry-pick的用法
  10. LeetCode 357. 计算各个位数不同的数字个数(DP)
  11. TikZ绘图示例——尺规作图: 圆内接任意正边形的近似画法(以正七边形为例)
  12. python链表值讲解_python数据结构之链表的实例讲解
  13. 关于sources.list和apt-get [转载]
  14. jQuery动画效果之上卷下拉
  15. docker 厂商 容器_容器化 - 边缘计算的新方向
  16. 电脑编程工作工资多少?
  17. 【区块链开发指南】序言
  18. 解释颜色深度概念:8 bit、16 bit、32 bit的意思
  19. 电脑键盘部分按键失灵_笔记本键盘个别按键失灵怎么处理win10
  20. 计算机网络实验:802.3协议分析和以太网

热门文章

  1. PTA 实例1.1:最大子列和问题
  2. 核心银行系统 之二十 业务架构
  3. 笔记本电脑更换硬盘和内存
  4. 2023什么电脑配置适合机器学习和人工智能
  5. 软件架构(六)MVC架构历史
  6. iqoo5什么时候上市
  7. 【面试经验】三轮面试拿到华为Offer
  8. 攻防演习紫队第二篇之组织的不同阶段
  9. android phone电脑驱动下载,HTC手机Android Phone驱动下载地址及安装教程详细介绍
  10. java云盘_云盘的JAVA简单实现