【C++ Primer Plus学习记录】循环和文本输入cin.get

目录

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命令提示符模式的重定向运算符。

其次,很多操作系统都允许通过键盘来模拟文件尾条件。

  • 45
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值