C++笔记——io流条件状态

C++:C++的IO流 一篇带你完全掌握C++的IO流 阅读详情
io流的条件状态(iostate)一共有4种:
eofbit  已到达文件尾
failbit  非致命的输入/输出错误,可挽回
badbit  致命的输入/输出错误,无法挽回
goodbit  正常,可继续使用

C++ Primer中并没有从本质上去讲这个东西到底是什么,并不好理解,作者认为应该以以下角度去理解io流的条件状态(以下仅代表作者个人的理解,并未查证其真实性)

在istream或ostream类中,可能存在这么一个变量,它包含3个二进制位,这个变量表示一个stream对象所处于的状态,可以想象成3个开关,但是4个状态为什么只用3个二进制位呢?那是因为第4个开关goodbit实则完全取决于前3个开关,前3个开关只要有一个打开,则说明io流已经出错,第4个开关必须关闭,由此,goodbit实际传达的意思是前3个状态都是关闭状态这一信息,而并不是真正存在goodbit这么一个开关。所以这四种状态可以用这3个二进制数来表示(4个常量,不要错误的认为是变量,下文中使用这四个词的时候,有时候是表示这个常量的值,有时候表示这个状态所对应的在io条件状态变量中的二进制位置,根据上下文而定):
eofbit:001
failbit:010
badbit:100
goodbit:000

此处还需要注意的一个点是,这三个开关并不是互斥的,也就是可以同时打开或打开其中的任意两个(从逻辑上不一定符合,比如eofbit和badbit不可能同时发生,但是是可以人为这么设置的)

每次使用cin或者cout,系统根据结果,设置这个变量中的3个二进制位的值。

根据以上,就可以很好的理解io流条件状态涉及到的几个函数了:
rdstate():获取保存当前状态的那个变量的值

eof():判断存储状态的变量中eofbit那个二进制位是否=1(不论其他位的值)
fail():判断存储状态的变量中failbit那个二进制位是否=1(不论其他位的值)
bad():判断存储状态的变量badbit那个二进制位是否=1(不论其他位的值)
good():判断存储状态的变量eofbit、failbit、badbit的二进制位是否全部为0

setstate()和clear():
在讲这两个函数前,必须先论述两个概念:复位和置位。
如果单拿出来一个,从字面意思上来理解,复位是把一个开关拨回到初始时候的位置,而置位是把一个开关根据用户的想法置于关闭或者开启的位置,但是这样理解是完全错误的。。。作者作为一个小白在这个概念上也是纠结的好久才想明白是怎么回事。。。

复位,实则就是关闭;而置位,实则就是开启。

setstate()的作用是置位,也就是开启3个状态中的1个或者几个,需要传入一个iostate值,然后将传入值中的3个二进制位中为1的位置识别,将原io流条件状态变量中的对应位置设置为1,其他位置不变,说白了就是用状态变量 |= 传入的变量。(这里要有二进制计算的基础)。

而clear()的作用则是复位,与setstate形式相同,作用相反,它的本质是用状态变量 &= 传入的变量,把传入的变量中为0的位置在原条件变量中也设置为0,其他位置不变。

举个C++ Primer书上的例子:(作者也是因为一下子想不明白这个例子才进行深入的思考)
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit),书上的解释是复位failbit和badbit,保持其他标志位不变

作者一开始想不明白的点在于clear这个函数既然已经指定了关闭这个操作,那么括号中的参数应该是指定要关闭哪几个位置,但是参数却直接给出了最终要设置到的状态,那么直接用 io条件状态变量 = cin.rdstate() & ~cin.failbit & ~cin.badbit进行直接赋值可好?况且还有一个setstate()函数,如果参数已经给的这么详细,那么clear()和setstate()做的事情不应该是完全一样嘛——将io状态条件变量设置成传入的参数那样。然而我们不能钻这个牛角尖。。。它就是这样,当初的设计者心中的逻辑应该是必须将打开和关闭分开,用|=和&=这两个运算符来区分打开和关闭操作。

那么这条语句就很清晰了,在参数中传入一个变量,将原io条件状态变量中要关闭的二进制位,在传入的这个变量中的对应位置设为0,语句中以原io条件状态变量为标准,将其failbit和badbit这两个位置设为0,其他不管,则得到了一个符合条件的传入参数。(注:这里面还有一个容易迷惑人的地方,那就是failbit和badbit不是变量,而是一个常量,固定表示 010 和 100 ,不要因为是用cin.引出来的,就错误的认为是cin的属性)。

这里就不免要吐槽一下。。这个操作就好像开灯和关灯非得要用两只手,开灯必须用左手开,关灯要用右手关,setstate和clear的本质区别是其内部到底用|=还是用&=,其实是可以用一个函数解决的事情,可能C++的设计者觉得这样在逻辑上更合理,所以使用了这样一种开关灯用不同手的模式。不过也正是这种模式,才有了下面一个用起来很方便的函数:
clear的()重载版本,它不需要传入参数,作用是复位全部3个二进制位,相当于状态变量 &= 000。

本文内容主要来自于作者在阅读C++ Primer时候的一些心得和体会,部分参考网上的一些说法,未经过严格的验证,欢迎批评指正!
C++中流状态badbit, failbit, eofbit 1. badbit表示发生系统级的错误,如不可恢复的读写错误。通常情况下一旦badbit被置位,流就无法再使用了。 2. failbit 表示发生可恢复的错误,如期望读取一个数值,却读出一个字符等错误。这种问题通常是可以修改的,流还可以继续使用。 3. 当到达文件的结束位置时,eofbit 和 failbit 都会被置位。 4. goodbit 被置位表示流未发生错误。如果badbit fa... 阅读详情

相关推荐

c++ 标准库 STD

学习标准库的,赶紧下吧。很牛叉的书。 是有关标准库的函数库介绍,和示例

c++io库条件状态

1.4种条件状态 badbit 用来指出流已经崩溃,属于系统级错误,如不可恢复的读写错误。 failbit 表示一个io操作失败了,比如读取数字却读取的是字符,这是可以恢复的 eofbit 用来表示文件达到文件结尾,这也是可以恢复的 goodbit 表示流的状态正常 注意的是,一但流发生错误,其上后续的io操作都会失败,只有流属于无错状态时,我们才可以 用来读取数据,写入数据。 ...

qq_43702629的博客 491

openeuler在线/离线安装docker服务

openeuler在线/离线安装docker服务

haixuti7的博客 1071

C++Primer 01_iostate I/O 流状态

是 C++ 中用于表示 I/O 流状态的类型。它是一个位掩码,可以表示流的各种状态,例如错误、文件结束等。成员函数手动设置流的状态位(例如,模拟一个失败的 I/O 操作)。的使用允许我们更细致地控制和检查 I/O 流的状态,这对于错误处理和调试非常有用。在这个示例中,我们首先尝试打开一个文件并读取内容。成员函数来获取当前流的状态,并根据状态位进行相应的处理。成员函数,我们可以确定流的状态。我们还展示了如何使用。成员函数来清除特定的状态位,将流恢复到一个良好的状态。接下来,我们展示了如何使用。

2302_79752447的博客 529

Simulink中通过MEX与MinGW实现C/C++结构体变量的高效导入

本文详细介绍了在Simulink中通过MEX工具链与MinGW编译器,高效导入C/C++结构体变量的完整流程。文章从需求背景出发,逐步讲解了MinGW环境配置、.h文件编写规范、核心导入命令Simulink.importExternalCTypes的使用,以及如何在MATLAB Function模块和总线创建器中调用自定义结构体,旨在实现模型与代码的无缝对齐,为后续仿真和代码生成奠定坚实基础。

weixin_29056781的博客 343

神领物流-day01-项目概述

公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。

心飞为你飞 2255

C++IO库的基本操作

成员函数open和close:open打开文件,失败返回failbit状态,要进行open的检查操作,close关闭文件**,操作完一个文件后一定要关闭**对要求使用基类对象的地方,可以用继承类型的对象来调用,例如在istream&的地方传递ifstream;:检测是否触发(置位)failbit或者badbit,如果触发,则返回true。eofbit:表示流到达文件或读取的末尾;:检测是否触发(置位)badbit,如果触发,则返回true。:检测是否触发(置位)eofbit,如果触发,则返回true。...

ylh的博客 649

yolov8x-p2 实现 tensorrt 推理

yolov8x-p2, tensorrt 实现.

J。 2273

c++primer 第八章IO操控流的条件状态

以下流出了IO类所定义的一些函数和标志 strm::iostate strm是一种IO类型,iostate是一种机器相关的类型,提 供了表达条件状态的完整功能 strm::badbit 用来指出流已崩溃 strm::failbit 用来指出一个IO操作失败了 strm::eofbit 用来指出流到达了文件结束 strm::goodbit 用来指出流未处于错误状态

冰凝凝的专栏 646

基于STM32F4XX 、HAL库的SHT40-CD1B-R3温湿度传感器驱动应用C语言程序设计

define SHT40_ADDR_READ 0x8B // CD1B 读地址 ((0x45 << 1) + 1)#define SHT40_ADDR_WRITE 0x8A // CD1B 写地址 (0x45 << 1)// 初始化 I2C1 (根据 CubeMX 生成的函数)// 湿度: -6%RH + 125%RH * (raw / 2^16)// 温度: -45°C + 175°C * (raw / 2^16)// 返回值: 0=成功, 1=失败(CRC错误或I2C通信错误)

PP_Cottage的博客 236

SAE ARP 4761A内容详解

SAE ARP 4761A主要为民用航空系统及设备的安全评估提供指南,帮助制造商和设计者满足FAA的FAR 25.1309等适航标准的要求。该文档旨在为航空器和航空系统设计中涉及的安全评估流程提供一个结构化的框架,并结合一系列工具和方法,如故障树分析(FTA)、依赖图分析(DD)、马尔可夫分析(MA)等,来系统地评估潜在的安全隐患。这一标准不仅适用于大型航空器的设计和评估,还可以应用于各种类型的飞行系统,如无人驾驶飞行器(UAV)和新型的电动垂直起降飞机(eVTOL)。

qq_41854911的博客 3147

C++学习笔记IO库 1 IO条件状态以及缓冲机制(iostream——输入输出流,fstream——文件流,sstream——string流)

IO类 头文件iostream, 是关联到用户的控制台窗口的。我们常用的cin,cout,cerr,>>运算符,<<运算符,getline()函数等。 除了iostream,还有文件流,和string流 头文件fstream (file stream,文件流):它是对文件的操作 头文件sstram (string stream ,string流):它是对string进行读写等操作。 IO类的条件状态 ...

weixin_61198922的博客 1220

2026年全国青少年信息素养大赛算法应用主题赛C++样题及答案解析

2026年全国青少年信息素养大赛算法应用主题赛C++样题

王老师青少年编程 3714

【C++标准IO库】条件状态

在C++编程中,处理输入输出(IO)操作时,了解流的状态是至关重要的。C++标准IO库提供了一系列机制来检测和设置流的状态,帮助开发者编写更健壮和可靠的代码。本文将全面介绍C++标准IO库的条件状态,包括状态标志位、状态检测函数、状态管理函数,以及条件状态对IO操作的影响,并通过代码示例和图示来加深理解。

byte轻骑兵的技术小窝 8320

如何在 Ubuntu 24.04 LTS 上安装 SSH 服务器?

Ubuntu是一个基于Debian的开源Linux操作系统,由Canonical Ltd.开发和维护。Ubuntu致力于提供用户友好、稳定且安全的操作系统环境,适用于个人用户、企业和服务器等不同场景。Ubuntu 24.04 LTS是Ubuntu发布的一个长期支持版本,LTS代表长期支持(Long Term Support)。这意味着Ubuntu 24.04 LTS将获得长达5年的安全更新和维护支持,使其成为企业和个人用户的理想选择。

网络技术联盟站 5888

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【C++】IO流

💬 hello!各位铁子们大家好哇。今日更新了C++IO流的相关内容在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?使用itoa()函数使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定, 而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。

qinjh_的博客 3705

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C++】IO库 && IO流

【C++】 IO库 && IO流,一文带你搞懂C++的 IO流

tan_run的博客 1999

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++三大IO流类总结——标准IO流、文件IO流、内存IO流

C++三大IO流类总结——标准IO流、文件IO流、内存IO流 IO流类一览标准IO流标准IO流的条件状态条件状态标志条件状态函数标准IO流的输入输出成员函数代码示例条件状态put和get函数getline函数标准IO的格式控制输出格式控制缓冲区控制控制bool类型格式进制控制其他常用输出格式控制输入格式控制文件输入输出流字符串输入输出流类 IO流类一览 ios:流基类(抽象类) istrea...

black_kyatu的博客 5198

【C++笔记】C++IO流的深度剖析

哈喽,各位小伙伴大家好!上期我们讲了模版的特化及其编译分离。今天我们来讲一下C++三大特性之继承。话不多说,我们进入正题!向大厂冲锋。

大白的编程日记. 1345

『C++』C++的IO流详解

C++的IO流详解

枫叶先生的博客 2304

C++中的IO流详解

由于不能拷贝IO对象,因此我们也不能将形参或者返回类型设置为流类型。读写一个IO对象会改变其状态,因此传递和返回的引用是不能const的。

weixin_70001451的博客 1639

【C++】C++的IO流

本篇博客主要介绍的是C++的IO流。的那套东西是面向过程的,C++这套东西是面向过程的。我们可以使用一个类来进行文件的读写,其中最重要的就是把C++对于文本文件读写的方法学一学,用着很方便。其他的作为了解知识学一学。

fight_p的博客 1592
下一篇: VS生成的C++项目常用目录设置
分号键已抠
博客等级 码龄9年 1粉丝 2原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值