Originally Posted by
dwks
When you try to parse a number out of '|', that character will remain in the input stream, and the stream (cin) will enter an error state. You need to remove the '|' from the stream and clear the error state as well, before you can use it for anything else (for example, reading another number).
cin.clear() will clear the error state; but that leaves the offending '|' still in the input stream.
std::cin.ignore() and std::cin.clear()
To deal with both problems, you might consider using
Code:
cin.ignore(1000, '\n'); // ignore lots of characters, up until a newline
cin.clear(); // clear error state
There's a better constant to use than 1000, of course. I leave it up to you to search the boards and find it if you're curious.
Thank you for the hint. Does this mean I need to add these two statements as in the following? It still doesn't work somehow :-<
Code:
// Exercise 8 - Chapter 5 ("Programming: Principles and Practice using C++")
#include "std_lib_facilities.h"
int main()
try {
vector <int> numbers;
int num, sum;
unsigned int N = -1;
cout << "Enter some numbers (press '|' at prompt to stop):";
while (cin>>num)
numbers.push_back(num);
cin.ignore(1000, '\n'); // ignore lots of characters, up until a newline
cin.clear(); // clear error state
cout << "Enter how many of the first numbers you want to sum: \n";
cin >> N; // PROBLEM HERE!!! - It cannot read in N!
if (N>numbers.size()) error("Too many numbers than are available in the series", numbers.size());
if (N<1) error("The number must be at least 1");
cout << "The sum of the first " << N << " numbers: ";
sum = 0;
for (unsigned int i=0; i<N; ++i) {
sum += numbers[i];
cout << numbers[i] << ", ";
if (i==(N-1)) cout << " and";
}
cout << " is " << sum << endl;
}
catch (runtime_error e) { // this code is to produce error messages
cout << e.what() << '\n';
}