// cin_unget_char.cpp
#include <cassert>
#include <iostream>
using std::cin;
using std::cout;
using std::ios_base;
int get_value( char delimiter )
{
int value = 0;
while ( !( cin >> value ) ) {
// cin is not good, more checks required.
if ( cin.bad() ) {
return 0; // signal error back to the operating system
}
if ( cin.eof() ) {
return 0; // signal success to the operating system
}
if ( cin.fail() ) {
cin.clear(); // go back to good state.
// do something to recover...
char ch = 0;
if ( cin >> ch ) {
if ( ch == delimiter ) {
// data delimiter was encountered and should be ignored:
continue;
}
// User typed something unexpected!
cin.unget(); // put last character back into the input buffer
cin.clear( ios_base::failbit ); // restore cin.fail() state
return ch; // report what the char they typed
}
}
}
return value;
}
int main()
{
cout << "Please type some numbers separated by spaces or semicolons.\n";
cout << "Type CTRL+Z followed by ENTER on windows (or CTRL+D on unix) to exit.\n";
for (;;) {
const char delimiter = ';';
int value = get_value( delimiter );
if ( !cin ) {
// cin is not good, more checks required:
if ( cin.bad() ) {
cout << "cin is corrupted, exiting the program.\n";
return 1; // signal error back to the operating system
}
if ( cin.eof() ) {
cout << "EOF found, exiting the program.\n";
return 0; // signal success to the operating system
}
if ( cin.fail() ) {
cin.clear(); // go back to good state.
char ch = 0;
if ( cin >> ch ) {
assert( ch == value );
cout << "Sorry, character [" << ch << "] was unexpected at this time. Exiting...\n";
break;
}
}
}
cout << "You entered: " << value << '\n';
}//for
return 0;
}