您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer第四版》学习笔记(二)快速入门 - 读入未知数目的输入

2014-05-13 08:02 417 查看
利用 读入流 对象性质:当我们使用istream对象作为条件,结果是测试流的状态。如果流是有效的(也就是说,读取下一个流逝可能的)那么测试成功。遇到文件结束符(end-of-file)或遇到无效输入时,如读取了一个不符合输入的值,则istream是无效的。处于无效状态的istream对象将导致条件失败。

EOF(文件结束符):
从键盘输入文件结束符,操作系统使用不同的值作为文件结束符。

从一个终端的输入从来不会真的“结束”(除非设备被断开),但把从终端输入的数据分区成多个“文件”却很有用,因此一个关键的串行被保留下来来指明输入结束。在UNIX和AmigaDOS中,将击键翻译为EOF的过程是由终端的驱动程序完成的,因此应用程序无需将终端和其它输入文件区分开来。在默认情况下,驱动程序在行首传送一个Control-D来指明文件结束,或者,在AmigaDOS中,驱动程序传送一个Control-\来指明文件结束(而Control-D被用作中断字符)。要向输入流中插入一个真正的Control-D
(ASCII 04)字符,用户需要把一个“引用”命令字符(通常是Control-V)放在它的前面。

在微软的DOS和Windows(以及CP/M和许多DEC操作系统)中,从终端读取数据不会产生EOF。此时,应用程序知道数据源是一个终端(或者其它“字符设备”),并将一个已知的保留的字符或串行解释为文件结束的指明;最普遍地说,它是ASCII码中的Control-Z(代码26)。一些MS-DOS程序,包括部分微软MS-DOS的shell(COMMAND.COM)和操作系统功能程序(如EDLIN),将文本文档中的Control-Z视为有意义数据的结尾,并且/或者在写入文本文档时将Control-Z添加到文档末尾。这是由于两个原因:
向后兼容CP/M。CP/M的文件系统仅仅以128字节“块”的倍数记录文件长度,所以当有意义数据在一个“块”的中间结束时,习惯上用Control-Z字符来标记它。而MS-DOS文件系统总会记录文件确切的字节长度,所以这在MS-DOS中不再必要。
它使得应用程序在从终端和文本文档读取数据时得以使用相同的代码。

在ANSI X3.27-1969磁带标准中,文件结束是由带标记(英语:tape mark)指明的,它由一个约3.5英寸的间隙和随后的一个字节组成,在九轨磁带中这个字节包含字符13(十六进制),而在七轨磁带中包含字符17(八进制)。[2]带结尾(英语:end-of-tape),通常缩写为EOT,是由两个带标记指明的。这是在像IBM 360这样的机器上使用的标准。指明快到磁带物理结尾的反射棒也被称为一个EOT标记。

例子:
用户指定一组数求和,我们不知道要对多少个数求和,而是要一直读数知道程序输入结束。输入结束时,程序将总和写到标准输出:
#include<iostream>
int main()
{
     int a, sum = 0;
     while(std::cin >> a)
          sum += a;
     std::cout << "The sum "<< " is " << sum << std::endl;
     return 0;
}

输入: 1 2 3 4.5
输出:The sum is 6
输入:1 2 3 换行符

^z

输出:The sum is 6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: