I have a question which is slightly similar to this question on stackoverflow std::cin.clear() fails to restore input stream in a good state, but the answer provided there does not work for me.
The question is: how can I reset the state of a stream to 'good' again?
Here is my code how I try it, but the state is never set to good again. I used both of the lines ignore separately.
int _tmain(int argc, _TCHAR* argv[])
{
int result;
while ( std::cin.good() )
{
std::cout << "Choose a number: ";
std::cin >> result;
// Check if input is valid
if (std::cin.bad())
{
throw std::runtime_error("IO stream corrupted");
}
else if (std::cin.fail())
{
std::cerr << "Invalid input: input must be a number." << std::endl;
std::cin.clear(std::istream::failbit);
std::cin.ignore();
std::cin.ignore(INT_MAX,'\n');
continue;
}
else
{
std::cout << "You input the number: " << result << std::endl;
}
}
return 0;
}
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
thenstate == rdstate();
otherwiserdstate()==(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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With