cin.rdstate()返回什么?

时间:2018-06-11 04:24:17

标签: c++

我正在读一本书并说:

  

要关闭单个条件,我们使用rdstate成员和按位运算符来生成所需的新状态。
  例如,以下操作会关闭failbitbadbit,但不会触及eofbit
    // 关闭failbit和badbit,但所有其他位不变。
    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
    它是位掩码类型,我也看到它是“/ 实现定义 /”。

  3. 找出位掩码类型是什么以及iostate在编译器中的实现方式。
    http://en.cppreference.com/w/cpp/concept/BitmaskType
    typedef int iostate,visual c ++。
    没有有用的信息。我被困在这里。

  4. 所以我仍然不清楚rdstate()返回的值是什么以及该代码行如何工作。

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

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

1 个答案:

答案 0 :(得分:2)

  

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

流具有某种状态,它可以同时具有多个状态,因为它们都不是正交的(例如,它可以同时为EOFbad) 。不是定义N个不同的状态变量,而是仅采用单个变量,并为不同的正交状态保留该变量的某些。因此,如果要检查某个状态,则必须检查某些位(哪个位具有实现定义的含义并且知道它们并不是非常有用),或者使用提供的函数,如good()eof()等。可以找到总结其行为的表格,例如here

rdstate()完全返回完整的状态变量。那么这行代码意味着: "将流的状态设置为当前状态,但删除任何failbit和任何badbit。这是一个数字中的二进制数字发生的情况,如果你和它想要删除的位的补码,即如果你想删除1101的第一位,你取1000的补数,即0111,因此1101& 0111 == 0101。 类似地,如果要在变量中设置某个位,则使用按位OR,例如, 0101 | 1000 == 1101。 有关按位操作的更多信息,请查看以下内容: this one

  

顺便问一下,我应该如何探索新的东西(用C ++编写),有什么建议吗?我的意思是,我已经检查了文档,但我发现它不是很有帮助。 (例如,Python和JavaScript文档更容易阅读和理解)

C ++文档很可能详细解释了bitmasks的一般概念,因为这是一个相当陈旧但却很常见的C语言。现在,它应该被认为是C ++中的一个遗留物,因为它对初学者来说太混乱了,但由于向后兼容性,它仍然占优势。