cin >>
Views InputThe various versions of the extraction operator share a common way of looking at the input stream. They skip over white space (blanks, newlines, and tabs) until they encounter a non-white-space character. This is true even for the single-character modes (those in which the argument is type char
, unsigned char
, or signed char
), which is not true of C’s character input functions (see Figure 17.5). In the single-character modes, the >>
operator reads that character and assigns it to the indicated location. In the other modes, the operator reads in one unit of the indicated type. That is, it reads everything from the initial non-white-space character up to the first character that doesn’t match the destination type.
For example, consider the following code:
int elevation;
cin >> elevation;
Suppose you type the following characters:
-123Z
The operator will read the -
, 1
, 2
, and 3
characters because they are all valid parts of an integer. But the Z
character isn’t valid, so the last character accepted for input is the 3
. The Z
remains in the input stream, and the next cin
statement will start reading at that point. Meanwhile, the operator converts the character sequence -123
to an integer value and assigns it to elevation
.
It can happen that input fails to meet a program’s expectation. For example, suppose you enter Zcar
instead of -123Z
. In that case, the extraction operator leaves the value of elevation
unchanged and returns the value 0
. (More technically, an if
or while
statement evaluates an istream
object as false
if it’s had an error state set; we’ll discuss this in more depth later in this chapter.) The false
return value allows a program to check whether input meets the program requirements, as Listing 17.11 shows.
// check_it.cpp -- checking for valid input
#include <iostream>
int main()
{
using namespace std;
cout << "Enter numbers: ";
int sum = 0;
int input;
while (cin >> input)
{
sum += input;
}
cout << "Last value entered = " << input << endl;
cout << "Sum = " << sum << endl;
return 0;
}
Here’s the output of the program in Listing 17.11 when some inappropriate input (-123Z
) sneaks into the input stream:
Enter numbers: 200
10 -50 -123Z 60
Last value entered = -123
Sum = 37
Because input is buffered, the second line of keyboard input values didn’t get sent to the program until you pressed Enter at the end of the line. But the loop quit processing input at the Z
character because it didn’t match any of the floating-point formats. The failure of input to match the expected format, in turn, caused the expression cin>> input
to evaluate to false
, thus terminating the while
loop.
3.149.27.72