c++ - How while(!(cin >> x)) works to re-prompt for input -
while(!(cin >> ar[i])) { cin.clear(); // clears bad input while(cin.get() != '\n') continue; cout << "invalid input, please enter valid scores"; }
the above code larger file. copied bit of code 1 of textbooks , don't feel comfortable using not understand how works.
i using measure handle input errors.
so ar
empty array of integers, if decide enter 'k', then
!(cin >> ar[i])
is true.
from here clear input buffer (i think correct, i'd confirm or dispute please). terminal prints "invalid input..." if press enter nothing happens, isn't enter newline char? shouldn't code read
while(cin.get() == '\n'
?
while(!(cin >> ar[i]))
this tries parse value cin
, store in ar[i]
. default, >>
skips whitespace first, sees if characters in cin
describe legal value whatever type of ar[i]
is. if legal value found, cin
stream state remains good
, , operator bool() const
kick in given boolean not
/!
operation, such while
loop break.
if parsing fails though, stream state set 1 or more of:
bad
(if there's unrecoverable stream error, stdin supplied on network connection gets disconnected),fail
(if characters didn't form legal value type), oreof
(end of file, "proper" shutdown/close of input, supplied ^d in unix/linux, ^z in windows, , end of input when program's invoked inecho input | program
).
all above modalities described under "state functions" here.
if loop entered due of error conditions above...
{ cin.clear(); // clears bad input
...this not clear input data stream, clear bad
, eof
, fail
state flags, after further input attempts can made, though stream in bad
or eof
state reenter state when further input attempted (but not - os may allow successful input after eof
conditions std::cin
if user types/generates eof code types actual text again...
while(cin.get() != '\n') continue;
this tries read characters terminal until newline \n
encountered. idea's clear out rest of presumed unparse-able input might have led fail
condition earlier. sadly, if problem was, or becomes, bad
or eof
condition loop hang program, spinning burning cpu no avail.
cout << "invalid input, please enter valid scores"; }
if problem mistyped value , no bad
or eof
condition, cout
prompt further input.
now if press enter nothing happens, isnt enter newline char?
whenever outer loop executing cin >> ar[i]
skip whitespace, including newlines type, until sees input (which may need full newline-terminated line flushed terminal or program feeding program), or bad
or eof
condition. inner while-loop not there rid of empty lines - it's trying discard line presumed non-numeric text in it.
corrected code:
while (!(std::cin >> ar[i])) { if (std::cin.bad() || std::cin.eof()) { std::cerr << "fatal error on cin while reading numbers\n"; exit(exit_failure); } std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "invalid input, please enter valid scores\n: "; }
Comments
Post a Comment