我正在读一本书并说:
要关闭单个条件,我们使用
rdstate
成员和按位运算符来生成所需的新状态。
例如,以下操作会关闭failbit
和badbit
,但不会触及eofbit
:
// 关闭failbit和badbit,但所有其他位不变。
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。
它是位掩码类型,我也看到它是“/ 实现定义 /”。
找出位掩码类型是什么以及iostate
在编译器中的实现方式。
http://en.cppreference.com/w/cpp/concept/BitmaskType。
typedef int iostate
,visual c ++。
没有有用的信息。我被困在这里。
所以我仍然不清楚rdstate()
返回的值是什么以及该代码行如何工作。
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
如何运作?
顺便问一下,我应该如何探索新的东西(用C ++编写),有什么建议吗?我的意思是,我检查了文档,发现这不是很有帮助。 (例如,Python和JavaScript文档更容易阅读和理解)
答案 0 :(得分:2)
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
如何运作?
流具有某种状态,它可以同时具有多个状态,因为它们都不是正交的(例如,它可以同时为EOF
和bad
) 。不是定义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 ++中的一个遗留物,因为它对初学者来说太混乱了,但由于向后兼容性,它仍然占优势。