C++中面向行的输入:get
我们来试试另一种方法。istream类有另一个名为get()的成员函数,该函数有几种变体。其中一种变体的工作方式与 getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但 get并不再读取并丢弃换行符,而是将其留在输入队列中。假设我们连续两次调用get():
cin.get(name,ArSize);
cin.get(dessert,Arsize);//aproblem
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此 get()认为已到达行尾,而没有发现任何可读取的内容。如果不借助于帮助,get()将不能跨过该换行符。幸运的是,get()有另一种变体。使用不带任何参数的 cin.get()调用可读取下一个字符(即使是换行符),因此可以用它来处理换行符,为读取下一行输入做好准备。也就是说,可以采用下面的调用序列:
cin.get(name,ArSize); // read first line
cin.get(); // read newline
cin.get(dessert,Arsize); //read second line
另一种使用 get()的方式是将两个类成员函数拼接起来(合并),如下所示:
cin.get(name,ArSize).get();//concatenate member functions
之所以可以这样做,是由于 cin,get(name,ArSize)返回一个 cin 对象,该对象随后将被用来调用 get()函数。同样,下面的语句将把输入中连续的两行分别读入到数组namel和name2中,其效果与两次调用cin.getline( )相同:
cin.getline(namel,ArSize).getline(name2,ArSize);
程序清单4.5采用了拼接方式。第11章将介绍如何在类定义中使用这项特性。
// instr3.cpp -- reading more than one word with get() & get()
#include <iostream>
int main()
{
using namespace std;
const int ArSize = 20;
char name[ArSize];
char dessert[ArSize];
cout << "Enter your name:\n";
cin.get(name, ArSize).get(); // read string, newline
cout << "Enter your favorite dessert:\n";
cin.get(dessert, ArSize).get();
cout << "I have some delicious " << dessert;
cout << " for you, " << name << ".\n";
// cin.get();
return 0;
}
下面是程序清单 4.5 中程序的运行情况:
Enter your name :
Mai Parfait
Enter your favorite dessert :
Chocolate Mousse
I have some delicious Chocolate Mousse for you, Mai Parfait
需要指出的一点是,C++允许函数有多个版本,条件是这些版本的参数列表不同。如果使用的是 cin.get(name,ArSize),则编译器知道是要将一个字符串放入数组中,因而将使用适当的成员函数。如果使用的是 cin.get(),则编译器知道是要读取一个字符。
对C++感兴趣的朋友点这里:C/C++课程