目录
1.使用原始的cin进行输入
2.使用cin.get(char)进行补救
3.使用哪一个cin.get()
4.文件尾条件
循环完后的一项最常见、最重要的任务:逐字符地读取来自文件或键盘的文本。
cin对象支持3种不同模式的单字符输入,其用户接口各不相同。下面介绍如何在while循环中使用这三种模式。
1.使用原始的cin进行输入
如果程序要使用循环来读取来自键盘的文本输入,则必须有办法知道何时停止读取。一种方法是选择某个特殊字符——有时被称为哨兵字符,将其作为停止标记。
例如,程序清单5.16在遇到#字符时停止读取输入。该程序计算读取的字符数,并回显这些字符,即在屏幕上显示读取的字符。按下键盘上的键不能自动将字符显示到屏幕上,程序必须通过回显输入字符来完成这项工作。通常,这种任务由操作系统处理。运行完毕后,该程序将报告处理的总字符数。程序清单5.16列出了该程序的代码。
//5.16
#if 1
#include<iostream>
using namespace std;
int main()
{
char ch;
int count = 0;
cout << "Enter characters;enter # to quit:\n";
cin >> ch;
while (ch != '#')
{
cout << ch;
++count;//字符数
//count++;
cin >> ch;
}
cout << endl << count << " characters read\n";
system("pause");
return 0;
}
#endif
可以看到程序在输出时省略了空格,这是因为cin。读取char值时,与读取其他基本类型一样,cin将忽略空格和换行符。因此输入中的空格没有被回显,也没有被包括在计数内。
更为复杂的是,发送给cin的输入被缓冲。这意味着只有在用户按下回车键后,他输入的内容才会被发送给程序。这就是在运行该程序时,可以在#后面输入字符的原因。按下回车健后,整个字符序列将被发送给程序,但程序在遇到#字符后将结束对输入的处理。
2.使用cin.get(char)进行补救
通常,逐个字符读取输入的程序需要检查每个字符,包括空格、制表符和换行符。cin所属的istream类(在iostream中定义)中包含了一个能够满足这种要求的成员函数。具体地说,成员函数cin.get(char)读取输入中的下一个字符(即使它是空格),并将其赋给变量ch。使用这个函数调用替换cin>>ch,可以修补程序清单5.16的问题。程序清单5.17列出了修改后的代码。
//5.17
#if 1
#include<iostream>
using namespace std;
int main()
{
char ch;
int count = 0;
cout << "Enter characters;enter # to quit:\n";
cin.get(ch);
while (ch != '#')
{
cout << ch;
++count;//字符数
//count++;
cin.get(ch);
}
cout << endl << count << " characters read\n";
system("pause");
return 0;
}
#endif
现在,该程序回显了包括空格在内的每个字符,并将全部字符计算在内。输入仍被缓冲,因此输入的字符个数仍然可能比最终到达程序的要多。
3.使用哪一个cin.get()
我们使用过三种版本的cin.get():
1.
int ArSize;
char name[ArSize];
cin.get(name, ArSize);
2.
cin.get();
3.
char ch;
cin.get(ch);
在C++中可以这样做的原因,C++支持被称为函数重载的OOP特性。函数重载允许创建多个同名函数,条件是它们的参数列表不同。例如,如果在C++中使用cin.get(name, ArSize),则编译器找到使用char*和int作为参数的cin.get()版本;如果使用cin.get(ch),则编译器将使用接受一个char参数的版本;如果没有提供参数,则编译器将使用不接受任何参数的cin.get()版本。函数重载允许对多个相关的函数使用相同的名称,这些函数以不同方式或针对不同类型执行相同的基本任务。
4.文件尾条件
程序清单5.17表明,使用诸如#等符号来表示输入结束很难令人满意,因为这样的符号可能就是合法输入的组成部分,其他符号(如@和%)也是如此。如果输入来自文件,则可以使用一种功能更强大的技术——检测文件尾(EOF)。C++输入工具和操作系统协同工作,来检测文件尾并将这种信息告知程序。
乍一看,读取文件中的信息似乎同cin和键盘输入没什么关系,但其实存在两个相关的地方。
首先,很多操作系统(包括Unix、Linux和Windows命令提示符模式)都支持重定向,允许用文件替换键盘输入。例如,假设在Windows中有一个名为gofish.exe的可执行程序和一个名为fishtale的文本文件,则可以在命令提示符模式下输入下面的命令:
gofish <fishtale
这样,程序将从fishtale文件,而不是键盘获取输入。<符号是Unix和Windows命令提示符模式的重定向运算符。
其次,很多操作系统都允许通过键盘来模拟文件尾条件。