c++ - cin.rdstate() 返回什么?
问题描述
我在看一本书,上面写着:
要关闭单个条件,我们使用
rdstate
成员和位运算符来产生所需的新状态。
例如,以下关闭但保持不变: //关闭 failbit 和 badbit 但所有其他位保持不变failbit
。badbit
eofbit
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
我对代码的作用感到完全困惑。
这是我试图弄清楚的方法:
找出 rdstate() 返回的内容。
http://en.cppreference.com/w/cpp/io/basic_ios/rdstate。
它返回一个iostate
对象。找出
iostate
对象是什么。
http://en.cppreference.com/w/cpp/io/ios_base/iostate。
这是一个位掩码类型,我也看到它是“/ implementation defined /”。找出什么是位掩码类型以及如何
iostate
在我的编译器中实现。
http://en.cppreference.com/w/cpp/concept/BitmaskType。
typedef int iostate
,视觉c++。
没有有用的信息。我被困在这里。
所以我仍然不知道rdstate()
返回值是什么样的以及那行代码是如何工作的。
如何cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
工作?
顺便说一句,我应该如何探索新的东西(在 C++ 中),有什么建议吗?我的意思是,我检查了文档,发现这不是很有帮助。(例如 Python 和 JavaScript 文档更容易阅读和理解)
解决方案
如何
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
工作?
一个流有一个特定的状态,嗯,它可以同时有多个状态,因为它们不是完全正交的(例如,它可以同时是正交EOF
的bad
)。不是定义 N 个不同的状态变量,而是只取一个变量,并为不同的正交状态保留该变量的某些位。因此,如果您想检查某个状态,您必须检查某些位(哪个位的含义是实现定义的,知道不是很有用),或者您使用提供的函数,如good()
,eof()
等等。可以在此处找到总结其行为的表格。
rdstate()
准确返回完整的状态变量。所以这行代码的意思是:“将流的状态设置为当前状态,但删除任何故障位和任何坏位。如果你将它与你的位的补码相加,这就是数字中的二进制数字所发生的事情想要删除,即如果要删除 1101 的第一位,则取 1000 的补码,即 0111,因此 1101 & 0111 == 0101。同样,如果要在变量内设置某个位,您使用按位或,例如
0101 | 1000 == 1101
。有关探索更多按位运算的有用答案,请查看例如这个。
顺便说一句,我应该如何探索新的东西(在 C++ 中),有什么建议吗?我的意思是,我检查了文档,发现这不是很有帮助。(例如 Python 和 JavaScript 文档更容易阅读和理解)
C++ 文档很可能会详细解释位掩码的一般概念,因为这是一种相当古老但在 C 中常见的方法。如今,它应该被视为 C++ 中的遗物,因为它对初学者来说太混乱了,但它由于向后兼容,它仍然盛行。
推荐阅读
- azure - 向 Azure AAD 注册的应用程序在身份验证质询时返回错误
- jquery - jQuery - 如何在 Ajax 表单提交中添加“或”
- twilio - Twilio Studio API 和更新账户之间的 function_sid
- c# - 为字符串数组中的每个元素添加/添加字符串
- python-3.x - PyDTMC 输出图与笔记本中的代码重叠
- java - 将不同的建议应用于不同的范围
- r - 如果另一个列表为 TRUE,则合并值
- mongoose - findOneAndUpdate 在嵌套文档内的内部值
- oracle - ODI 日期格式
- laravel - 在 laravel 或 livewire 中获取子类别