15.1.4 流式输入(1)
输入流为结构化数据和非结构化数据的读入提供了简单方法。本节以cin为例讨论了输入技术,cin即控制台输入流。
1. 输入基本概念
通过输入流,可以采用两种简单方法来读取数据。第一种方法类似于<<运算符,向输出流输出数据。读入数据对应的运算符是>>。通过>>从输入流读入数据的时候,通过代码中提供的变量保存接受的值。例如,以下程序从用户那里读入一个单词,并将这个单词保存在一个字符串中。然后这个字符串又被输出到控制台:
- string userInput;
- cin >> userInput;
- cout << "User input was " << userInput << endl;
-
- 代码取自Input\string.cpp
默认情况下,>>运算符根据空白符对输入值标志化。例如,如果一个用户运行以上程序并且键入hello there作为输入,那么只有第一个空白字符(在这个例子中为空格符)之前的字符才会被捕捉在userInput变量中。输出如下所示:- User input was hello
在输入中包含空白字符的一种方法是使用get(),本章后面会讨论这个方法。
>>运算符可以用于不同的变量类型,就像<<运算符一样。例如,如果要读取一个整数,那么只有变量类型的区别:
- int userInput;
- cin >> userInput;
- cout << "User input was " << userInput << endl;
-
- 代码取自Input\int.cpp
通过输入流可以读入多个值,而且可以根据需要混合和匹配类型。例如,下面这个函数摘选自一个餐馆预订系统,这个函数要求用户输入姓以及聚会就餐的人数:- void getReservationData()
- {
- string guestName;
- int partySize;
- cout << "Name and number of guests: ";
- cin >> guestName >> partySize;
- cout << "Thank you, " << guestName << "." << endl;
- if (partySize > 10) {
- cout << "An extra gratuity will apply." << endl;
- }
- }
-
- 代码取自Input\getReservationData.cpp
注意,>>运算符会根据空白字符符号化,因此getReservationData()函数不允许输入带有空白字符的姓名。一个解决方法是使用本章后面讲解的unget()方法。注意,尽管这里使用cout的时候没有通过endl或flush()显式地刷新缓存区,但是仍然可以将文本写入控制台,因为这里使用的cin立即刷新了cout缓存区;cin和cout通过这种方式连接在一起。
如果分不清<<和>>的作用,只要联想箭头的方向指向它们的目标即可。在输出流中,<<指向流本身,因为数据被发送至流。在输入流中,>>指向变量,因为数据被保存。