C++·io流

news2024/9/23 23:27:08

        本节主要是了解为主,需要具体使用时可以查看文档。

        io流操作指的是对各种流的操作,我们经常使用的cin和cout是对标准流的操作,实际上它还可以对文件流操作

        官网资料:Input/Output - C++ Reference

        流输入和流提取功能的实现中有着非常复杂的继承关系,也有着众多的接口,但是我们使用时一般只会涉及到 cin和cout等几个接口。

1. C++标准io流

        在C标准库中已经设定好了各种内置类型的标准流插入流提取功能,但是我们可以为自定义类型重载 >> << 运算符,来实现对自定义类型的标准输入输出,即cout数据从内存流向控制台,cin数据从键盘流到程序内存。

        cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时是从缓冲区拿。如果一次输入过多,就会都先堆在缓冲区慢慢用,缓冲区中的内容读用一个走一个。如果出现输入的数据与要提取的数据类型不匹配的情况,cin就会提取0,比如 cin 's'字符 给一个整形变量,这就是不匹配的情况,那此时这个整型变量会提取到0,同时字符 's' 被继续堆在缓冲区,cin的状态标志被修改,cin暂时无法正常使用了。

1.1 io流状态标志

        官网资料:ios - C++ Reference        ios::good - C++ Reference

        无论是 输入流istream 或是 输出流ostream 都具有上表中的四种状态标志,用来表示目前的这个流的使用状态,这四种状态标志是由它们的父类ios继承过来的。

        四种状态标志分别是

        使用good()函数查看的goodbit,为 1 代表流状态正常,为 0 说名状态异常

        使用eof()函数查看的eofbit,为 1 代表流提取到了文件结尾,为 0 反之

        使用fail()函数查看的failbit,为 1 代表流出现可修复的小问题,为 0 说明流状态正常

        使用bad()函数查看的badbit,为 1 代表流出现不可修复的大问题,比如缓冲区出现破坏等,必须结束程序的情况,为 0 说明没出现大问题。

        我们看下面这段代码:

        ​​​​​​​        

        在最初istream流都是一切正常的(红框),随后将 11t 输入进缓冲区中,第一次cin从缓冲区中流提取了11,发现t已经不是整形了于是不再提取,此时的istream流还没有问题(绿框)。第二次提取缓冲区中的数据时发现已经没有整形了,于是cin提取到默认值0,并将流状态标注成failbit(粉框)。此后istream流暂时不能再使用了,需要程序员进行手动修复。

        failbit标志也就是说现在出现的问题只是小问题,我们有办法进行修复的,具体办法就是clear,重设流状态。

        ​​​​​​​        ​​​​​​​        

        上面还是刚才那段代码,在将状态重设后就显示流状态正常了,此时仅仅时istream可以使用了。但是缓冲区中的那个 't'字符 因为没有被读取,所以还堆积在缓冲区中,因此,在实际使用中,要在重设状态之前将缓冲区读干净

1.2 cout 和 cin的效率问题

        C++的输入输出流缓冲区,与C的输入输出流缓冲区,是两块空间,但是为了做C C++的兼容,它们之间写了一些绑定关系,来保证它们的缓冲区是同步刷新的,防止在同时使用两种语言逻辑时出现的顺序不同步问题。

        但是因为存在这种绑定的关系就会造成资源上的消耗,因此当我们在进行算法竞赛或其他需要用到输入输出流,同时还要保证效率的情况下,可以手动进行解绑来提升效率。

        下面是解绑的三行代码

        ​​​​​​​        

2. 文件io流

        文件中的io流就是 ifstream 和 ofstream,它们的头文件是 <fstream> 它们的继承自istream和ostream,因此接口都是相似的。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        使用的时候ofstream用来写文件,ifstream用来读文件,文件可以直接在对象构造的时候进行打开,也可以手动 .open,关闭的话也不用手动 .close 因为是对象管理的文件,因此在出声明周期析构的时候会自动进行析构关闭文件。

3. 内存io流

        所谓内存io流就是把数据先都流插入到一个string字符串中备用,需要的时候通过 .str() 查看存储了哪些临时内容。

        其中我们要使用到的就是 ostringstream 和 istringstream ,它们的头文件是 <sstream> 

                        

        可以看到我们将 整形i 和 日期类d 都通过重载好的流插入操作存入了对象oss,并且可以通过成员函数访问到我们都往其中存储了什么。

                        

        我们也可以使用istringstream进行流提取,取到对应的对象中去。

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

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

相关文章

鸿蒙交互事件开发04——手势事件

1 概 述 手势事件是移动应用开发中最常见的事件之一&#xff0c;鸿蒙提供了一些方法来绑定手势事件。通过给各个组件绑定不同的手势事件&#xff0c;并设计事件的响应方式&#xff0c;当手势识别成功时&#xff0c;ArkUI框架将通过事件回调通知组件手势识别的结果。 …

记录一款人气领先的开源国产 ERP 系统

推荐一款人气领先的国产ERP系统&#xff0c;目前在Gitee上有12.3k star&#xff0c;在github上面也有1.2k 管伊佳ERP&#xff08;原名华夏ERP&#xff09;基于SpringBoot框架和SaaS模式&#xff0c;立志为中小企业提供开源好用的ERP软件&#xff0c;目前仅支持进销存财务生产功…

2025年第八届计算机图形和虚拟国际会议(ICCGV 2025)即将召开!

2025年第八届计算机图形和虚拟国际会议&#xff08;ICCGV 2025&#xff09;将于2025年2月21-23日在中国成都举行。随着信息技术的飞速发展&#xff0c;计算机图形学与虚拟现实技术正以前所未有的速度重塑着我们的认知世界与交互体验。从沉浸式游戏到精准医疗模拟&#xff0c;从…

气压测试实验(用IIC)

I2C: 如果没有I2c这类总线&#xff0c;连接方法可能会如下图&#xff1a; 单片机所有的通讯协议&#xff0c;无非是建立在引脚&#xff08;高低电平的变换高低电平持续的时间&#xff09;这二者的组合上&#xff0c;i2c 多了一个clock线&#xff0c;负责为数据传输打节拍。 (i2…

Unity3d中制作触发区域为圆形的按钮

一、常规矩形的Button制作 设置Highlighed Color为绿色。 此时当鼠标在button上方时会显示绿色&#xff1a; 二、圆形Button制作 在Button的Image中选择Source Image为Knob。 程序运行时&#xff0c;鼠标在矩形和圆形之间的区域&#xff0c;button还是会变成绿色。 所以&…

【时时三省】(C语言基础)指针进阶 例题5

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 abcdef是个常量字符串 把首地址a放在了p里面 第一个p 算的是指针变量的大小 它打印就是4或者8 第二个p1 p本来是a的地址 1就是b的地址 是地址就是打印四或者八 …

chapter14-集合——(List-LikedHashSet)——day18

目录 528-LikedHashSet介绍 529-LikedHashSet源码介绍 528-LikedHashSet课堂练习 528-LikedHashSet介绍 529-LikedHashSet源码介绍 528-LikedHashSet课堂练习

【计网】从零开始认识网络socket

优于别人&#xff0c;并不高贵&#xff0c; 真正的高贵应该是优于过去的自己。 --- 海明威 --- 从零开始认识网络socket 1 网络通信流程2 IP地址 VS MAC地址3 网络socket3.1 理解源 IP 地址和目的 IP 地址3.2 传输层的典型代表3.3 网络字节序3.4 socket编程基础 1 网络通信流…

高压直流接触器及使用注意事项

高压直流接触器及使用注意事项 1.概述2.接触器和继电器有什么区别3.节能线圈4.安装位置5.直流继电器线圈抑制6.高压继电器和接触器有哪些应用?7.线圈效率的决定因素是什么?对线圈驱动器有什么要求?8.负载极性对接触器的影响9.触点参数注意事项10.线圈供电要求1.概述 航空接…

基于单片机实现的的多点分布室内环境监测系统

基于STM32单片机为基础设计的一款室内环境监测系统程序源码 程序分为接收端和采集端两部分 接收端与采集端均以STM32单片机作为控制核心&#xff0c;两者通过ZigBee无线通信技术进行连接。接收端主要用于接收数据并将其实时显示以及报警。 采集端主要用于监测室内环境的各类数…

【Python工具】Python 装饰器实现统计函数执行时长

文章目录 1、背景2、轮子 1、背景 业务基本代码堆积完毕了&#xff0c;部分流程需要调优&#xff0c;想着在几个关键执行路径上进行时间记录&#xff0c;类似 SQL 慢日志一样的方法&#xff0c;方便进行性能问题发现。 了解了下&#xff0c;应该是采用装饰器实现是代码侵入最…

林草湿地址、导出echart为word

2.导出 // 导出exportDoc () {this.loading truelet arrRefs [this.$refs.endChart, this.$refs.processChart, this.$refs.officeEndChart]setTimeout(() > {Promise.all(arrRefs.map((canvasDom) > {return this.html2canvasHandle(canvasDom)})).then(res > {let…

如何让潜意识帮你实现你的目标

潜意识的力量是意识的3万倍以上 如果你有一个宏大的目标&#xff0c;怎么借助潜意识实现你的目标呢 比如&#xff0c;我的目标是&#xff1a;帮助100万人颠覆潜意识&#xff0c;实现人生蜕变&#xff0c;并且培养一万名潜意识开发导师 这么宏大的一个目标&#xff0c;怎么让…

B-树底层原理

一、B-树介绍 定义&#xff1a; B-树&#xff08;B-Tree&#xff09;是一种自平衡的树形数据结构&#xff0c;广泛应用于数据库和操作系统中。它的设计目标是减少搜索、顺序访问、插入和删除操作中比较次数和移动次数&#xff0c;特别适合于磁盘中数据的存储和检索。 性质&a…

运维团队日志管理策略参考

在运维工作中&#xff0c;日志管理是一项至关重要的任务。有效的日志管理不仅能够帮助运维团队实时监控系统状态、发现潜在问题&#xff0c;还能为故障排查和系统性能优化提供宝贵的数据支持。本文结合运维行业的实际需求&#xff0c;介绍了一套全面的日志管理策略&#xff0c;…

AutoDroid: LLM-powered Task Automation inAndroid论文学习

光看题目怎么和上一篇差不多&#xff1f;又是纯用LLM的&#xff1f; 当然还是有一点不一样的&#xff1a; 这里的最大特点是加上了UI领域知识&#xff0c;可以大幅增强LLM在处理UI方面的知识的能力。根据文章的说法&#xff0c;使用了这招他们的LLM可以吊打GPT4V&#xff0c;准…

node.js 完全卸载和下载配置

一、介绍 &#xff08;1&#xff09;node.js Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c; [1]让JavaScript 运行在服务端的开发平台&#xff0c…

Linux开发工具的使用

文章目录 vim的使用基本模式介绍光标当前行操作光标快速定位&#xff08;命令行模式&#xff09;&#xff1a;插入模式的三种方式&#xff08;命令行模式&#xff09;&#xff1a;vim基本操作&#xff08;命令行模式&#xff09;底行模式的操作 Linux编译器 - gcc/g的使用Linux…

录屏软件免费版:四款热门工具全面解析!

日常生活或工作中&#xff0c;我们经常有记录屏幕的需求。今天&#xff0c;就让我们来探索几款市面上广受欢迎的免费录屏软件&#xff0c;它们不仅功能强大&#xff0c;而且完全免费&#xff0c;让屏幕录制体验更加流畅和高效。 福昕录屏大师 直达链接&#xff1a;www.foxits…

比亚迪海豹06这油耗,丈母娘都叫好

文 | AUTO芯球 作者 | 雷慢 刚一朋友问我 有没有什么好看、价格低&#xff0c; 车大、油耗还低的车&#xff0c; 开到女盆友家能第一个动筷子。 哎&#xff0c;我要给你说的这车&#xff0c; 能不能第一个动筷子 首先看你未来的丈母娘喜欢什么货色的&#xff0c; 其次你…