15.1.4 流式输入(3)
putback()
putback()和unget()一样,允许在输入中流反向移动一个字符。区别在于putback()方法将从参数接收的字符放回流中:
- char ch1;
- cin >> ch1;
- cin.putback(ch1);
- // ch1 will be the next character read off the stream.
peek()
通过peek()方法可预览调用get()返回的下一个值。再拿滑槽的隐喻打比方,可以想象为查看一下滑槽,但是不把值取出来。
peek()非常适合于在取出一个之前需要预先查看这个值的场合。例如下面的代码实现了get- ReservationData()函数,允许名字中出现空白字符,但使用的是peek()而不是unget():
- void getReservationData()
- {
- string guestName;
- int partySize = 0;
- // Read letters until we find a non-letter
- char ch;
- cin >> noskipws;
- while (true) {
- // 'peek' at next character
- ch = cin.peek();
- if (!cin.good())
- break;
- if (isdigit(ch)) {
- // next character will be a digit, so stop the loop
- break;
- }
- // next character will be a non-digit, so read it
- cin >> ch;
- guestName += ch;
- }
- // Read partysize
- cin >> partySize;
- cout << "Thank you '" << guestName
- << "', party of " << partySize << endl;
- if (partySize > 10) {
- cout << "An extra gratuity will apply." << endl;
- }
- }
-
- 代码取自Peek\Peek.cpp
getline()
从输入流中获得一行数据是一个非常常见的需求,所以有一个方法能完成这个任务。getline()方法用一行数据填充字符缓冲区,数据量最多至指定大小。指定的大小中包括\0字符。因此,下面的代码最多从cin中读取kBufferSize-1个字符,或者读到行尾为止:
- char buffer[kBufferSize];
- cin.getline(buffer, kBufferSize);
-
- 代码取自Getline\Getline.cpp
调用getline()的时候,这个方法从输入流中读取一行,读到行尾为止。不过,行尾字符不会出现在字符串中。注意,行尾序列和平台相关。例如,行尾序列可以是\r\n、\n或\n\r。
有一个版本的get()执行的操作和getline()一样,区别在于get()把换行序列留在输入流中。
还有一个用于C++(www.cppentry.com) string的名为getline()的函数。这个函数定义在<string>头文件和std名称空间中。这个函数接受一个流引用,一个string引用以及一个可选的分隔符作为参数:
- string myString;
- std::getline(cin, myString);
-
- 代码取自Getline\Getline.cpp