tags:

views:

169

answers:

2

What's a better way to clear cin input? I thought cin.clear and cin.ignore was a good way...?

code:

 void clearInput()
{   
    cin.clear();
    cin.ignore(1000,'\n');
    //cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );

}

My teacher gave me this reply...

this is basically saying that your clearInput doesn't work FYI: ignore is NEVER a good idea as a way of getting rid of all that remains on a line

and your failing this test is exactly the reason why now go clear it the correct way

She has also told me this following:

on ignore you need to guess at how many characters you want to ignore If you absolutely know your data and it follows a strict format -- as in Excel spreadsheets, ignore is really good. If you are NOT in this type of file, then you NEVER use ignore. Question, is your data well-formed? If yes, use ignore. If not, don't use ignore.

List ALL the way of getting data? 1) there is extraction >>

and there is also??????

please list for me

+2  A: 

Copy-pasting from the standard,

basic_istream& ignore(streamsize n = 1, int_type delim = traits::eof());

24 Effects: Behaves as an unformatted input function (as described in 27.6.1.3, paragraph 1). After construct- ing a sentry object, extracts characters and discards them. Characters are extracted until any of the fol- lowing occurs:

  • if n != numeric_limits::max() (18.2.1), n characters are extracted
  • end-of-file occurs on the input sequence (in which case the function calls setstate(eofbit), which may throw ios_base::failure (27.4.4.3));
  • c == delim for the next available input character c (in which case c is extracted).

You commented line with numeric_limits<>::max is superior, but it looks like you didn't want to use something you didn't completely understand, which is also good.

The only thing someone could possibly want besides ignore is non-blocking behavior, i.e. don't wait for the user to press return if the terminal is in unbuffered mode. But that's just entirely unsupported by iostreams as far as I know.

Potatoswatter
+1  A: 

Your teacher’s reply are a bit unclear (at least to me).

Concerning ignore, your teacher is wrong in principle: ignore is the standard idiom of how to clear a stream (as shown by Potatocorn, this is even mentioned in the standard).

However, it’s important to notice that cin.ignore(1000) is indeed a bad way of doing this: this just presumes that there won’t be more than 1000 characters in the buffer. Never use such a magic number in ignore.

Instead, either use

  1. cin.rdbuf()->in_avail() (i.e. the available number of chars in the read buffer)1), or use
  2. numeric_limits<streamsize>::max().

1) Unfortunately, in_avail is broken on some recent VC (?) compilers so this method isn’t very portable.

Konrad Rudolph
right, i'm not exactly sure what she wants out of me here..there is extraction (>>), i guess the other one she is thinking of is getline? could cin.getline and cin.clear be used in this regard?and how do i know if the input has been cleared?
codefail
@igor: you could repeatedly `getline` (or `get`) until EOF or failure is signalled. But I don’t see how this would be in any way superior to `ignore`.
Konrad Rudolph
her reply to me asking why i cannot use ignore as Red-nosed unicorn pointed out:http://pastebin.com/eTWkPuFb
codefail
“What will work in all cases?” – easy: either of the codes I posted above. These codes will work no matter how many characters the user has entered *because they’re defined that way*!
Konrad Rudolph
yes, that works of course. i still don't know what she wants haha.
codefail