首页 > 解决方案 > cin.rdstate() 返回什么?

问题描述

我在看一本书,上面写着:

要关闭单个条件,我们使用rdstate成员和位运算符来产生所需的新状态。
例如,以下关闭但保持不变: //关闭 failbit 和 badbit 但所有其他位保持不变failbitbadbiteofbit

cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);

我对代码的作用感到完全困惑。

这是我试图弄清楚的方法:

  1. 找出 rdstate() 返回的内容。
    http://en.cppreference.com/w/cpp/io/basic_ios/rdstate
    它返回一个iostate对象。

  2. 找出iostate对象是什么。
    http://en.cppreference.com/w/cpp/io/ios_base/iostate
    这是一个位掩码类型,我也看到它是“/ implementation defined /”。

  3. 找出什么是位掩码类型以及如何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 文档更容易阅读和理解)

标签: c++

解决方案


如何cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);工作?

一个流有一个特定的状态,嗯,它可以同时有多个状态,因为它们不是完全正交的(例如,它可以同时是正交EOFbad)。不是定义 N 个不同的状态变量,而是只取一个变量,并为不同的正交状态保留该变量的某些。因此,如果您想检查某个状态,您必须检查某些位(哪个位的含义是实现定义的,知道不是很有用),或者您使用提供的函数,如good()eof()等等。可以在此处找到总结其行为的表格。

rdstate()准确返回完整的状态变量。所以这行代码的意思是:“将流的状态设置为当前状态,但删除任何故障位和任何坏位。如果你将它与你的位的补码相加,这就是数字中的二进制数字所发生的事情想要删除,即如果要删除 1101 的第一位,则取 1000 的补码,即 0111,因此 1101 & 0111 == 0101。同样,如果要在变量内设置某个位,您使用按位或,例如 0101 | 1000 == 1101。有关探索更多按位运算的有用答案,请查看例如这个

顺便说一句,我应该如何探索新的东西(在 C++ 中),有什么建议吗?我的意思是,我检查了文档,发现这不是很有帮助。(例如 Python 和 JavaScript 文档更容易阅读和理解)

C++ 文档很可能会详细解释位掩码的一般概念,因为这是一种相当古老但在 C 中常见的方法。如今,它应该被视为 C++ 中的遗物,因为它对初学者来说太混乱了,但它由于向后兼容,它仍然盛行。


推荐阅读