The code here
std::cin.clear(std::istream::failbit);
doesn't actually clear the failbit, it replaces the current state of the stream with failbit
.
To clear all the bits, just call clear()
.
The description in the standard is a bit convoluted, stated as the result of other functions
void clear(iostate state = goodbit);
Postcondition: If rdbuf()!=0
then state == rdstate();
otherwise rdstate()==(state | ios_base::badbit)
.
Which basically means that the next call to rdstate()
will return the value passed to clear()
. Except when there are some other problems, in which case you might get a badbit
as well.
Also, goodbit
actually isn't a bit at all, but has the value zero to clear out all the other bits.
To clear just the one specific bit, you can use this call
cin.clear(cin.rdstate() & ~ios::failbit);
However, if you clear one flag and others remain, you still cannot read from the stream. So this use is rather limited.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…