August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
当处理输入时,我们必须预计到其中可能发生的错误并给出相应的处理措施。输入中会发生什么类型的错误呢?应该如何处理呢?输入错误可能是由于人的失误(错误理解了指令、打字错误、允许自家的小猫在键盘上散步等)、文件格式不符、我们(程序员)错误估计了情况等等原因造成的。发生输入错误的可能情况是无限的!但istream将所有可能的情况归结为四类,称为流状态(stream state):
不幸的是,fail()和bad()之间的区别并未被准确定义,(定义新类型I/O操作的)程序员对此的观点各种各样。但是,基本的思想很简单:如果输入操作遇到一个简单的格式错误,则使流进入fail()状态,也就是假定我们(输入操作的用户)可以从错误中恢复。另一方面,如果错误真的非常严重,例如发生了磁盘读故障,输入操作会使得流进入bad()状态,也就是假定面对这种情况你所能做的很有限,只能退出输入。这种观点导致如下逻辑:
!cin可以理解为“cin不成功”或者“cin发生了某些错误”或者“cin的状态不是good()”,这与“操作成功”正好相反。请注意我们在处理fail()时所使用的cin.clear()。当流发生错误时,我们可以进行错误恢复。为了恢复错误,我们显式地将流从fail()状态转移到其他状态,从而可以继续从中读取字符。clear()就起到这样的作用——执行cin.clear()后,cin的状态就变为good()。 ...