I have done some cin
operation and before I use cin
I want to clear its state and
flush it. How do I do it? I know cin.clear()
clears the error state but to flush the cin
buffer how do I check if it's empty and if not which of the below statements shall I use to empty it so that I can safely use cin
later?
cin.ignore(std::numeric_limits<std::streamsize>::max());
or
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
It seems, you detected a problem and you want to get rid of erronous input, e.g., the entered line. You could try to get rid what std::cin
has in its buffer but generally, this doesn't work too well as there is no guarantee that the stream has read, e.g., a complete line. Also, to make it potentially useful you'll need to make sure that stdin
and std::cin
are not synchronized as otherwise std::cin
will never buffer any characters anyway:
std::ios_base::sync_with_stdio(false);
// read data using std::cin
if (!std::cin) {
// clean-up
std::cin.clear();
if (std::cin) {
std::cin.ignore(std::cin.rdbuf()->in_avail()); // ignore what is buffered
}
}
Whether in_avail()
will return a non-zero value depends entirely on the used stream buffer and it may ignore more than you actually want to ignore anyway. For example, if std::cin
's stream buffer is replaced to use the stream buffer of an std::istringstream
it will probably consume all the character from this source.
Probably the most sensible clean-up is to ignore()
the next character or the characters on the current line, using either
std::cin.ignore();
or
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
The max()
of std::streamsize
is used as a magical number to indicate that the count should not be considered a termination criteria. If you don't pass a termination character the stream will ignore characters until the end of the stream which is probably not what you want.
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