gpt4 book ai didi

c++ - cin.rdstate() 返回什么?

转载 作者:行者123 更新时间:2023-11-30 03:22:51 25 4
gpt4 key购买 nike

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

To turn off a single condition, we use the rdstate member and the bitwise operators to produce the desired new state.
For example, the following turns off failbit and badbit but leaves eofbit untouched:
//turns off failbit and badbit but all other bits unchanged.
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. 了解什么是Bitmask Type 以及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 文档更容易阅读和理解)

最佳答案

How does cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit); work?

一个流有一个特定的状态,好吧,它可以同时有多个状态,因为它们并不都是正交的(例如,它可以是 EOFbad同一时间)。无需定义 N 个不同的状态变量,只需取一个变量并为不同的正交状态保留该变量的某些。因此,如果你想检查某个状态,你必须检查特定的位(哪个位的含义是实现定义的,知道不是很有用)或者你使用提供的函数,比如 good( )eof() 等。可以找到总结他们行为的表格,例如here .

rdstate() 准确返回完整的状态变量。那么这行代码的意思是:“将流的状态设置为当前状态,但删除任何 failbit 和任何 badbit。如果您将它与要删除的位的补码进行 AND 运算,即如果您想要删除 1101 的第一位,你取 1000 的补码,即 0111,因此 1101 & 0111 == 0101。类似地,如果你想在变量中设置某个位,你可以使用按位或,例如0101 | 1000 == 1101。有关探索更多按位运算的有用答案,请查看例如this one .

Btw, how should I explore something new (in C++), any advice? I mean, I've checked the documentation and I found that's not very helpful. (e.g. Python and JavaScript docs are much easier to read and understand)

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

关于c++ - cin.rdstate() 返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50790501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com