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



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

这是我尝试找出的方法:

  • 找出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/BitmaskTypetypedef int iostate,可视C++
    没有有用的信息。我被困在这里。

  • 所以我仍然不知道rdstate()返回的值是什么样的,以及那行代码如何工作。
    cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);如何工作?

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

    最佳答案



    一个流具有某种状态,好吧,它可以一次具有多个状态,因为它们不是全部正交的(例如,它可以同时是EOFbad)。不用定义N个不同的状态变量,而是只取一个,并为不同的正交状态保留该变量的某些位。因此,如果要检查某个状态,则必须检查某些位(该位的含义是实现定义的,并且对了解不是很有用),或者使用提供的函数(如good()eof()等) 。可以找到总结其行为的表格,例如。 here
    rdstate()完全返回完整的状态变量。因此,这行代码的意思是:
    “将流的状态设置为当前状态,但删除任何故障位和任何故障位。这就是如果您将二进制位与要删除的位的补码进行AND运算(即,如果要删除1101的第一位,则取1000的补码,即0111,因此1101&0111 == 0101。
    同样,如果您想在变量中设置某个位,则可以使用按位或,例如0101 | 1000 == 1101
    有关探索按位运算的更多信息的有用答案,请参见例如this one



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

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

    10-11 19:11