当前位置: 首页 > 文档资料 > C++大学教程 >

11.8 流错误状态

优质
小牛编辑
131浏览
2023-12-01

可以用类 ios 中的位测试流的状态。类ios是输入/输出类 istream、ostream 和 iostream 的基类。

当遇到文件结束符时,输人流中自动设置 eofbit。可以在程序中使用成员函数eof确定是否已经到达文件尾。如果cin遇到了文件结束符,那么函数调用:

cin.eof()

返回 true,否则返回 false。

当流中发生格式错误时,虽然会设置failbit,但是字符并末丢失。成员函数fail判断流操作是否失败,这种错误通常可修复。

当发生导致数据丢失的错误时,设置badbit。成员函数bad判断流操作是否失败,这种严重错误通常不可修复。

如果eofbit、failbit或badbit都没有设置,则设置goodbit。

如果函数bad、fail和eof全都返回false,则成员函数good返回true。程序中应该只对“好”的流进行I/O操作。

成员函数rdstate返回流的错误状态。例如.函数调用cout.rdstate将返回流的状态,随后可以用一条switch语句测试该状态,测试工作包括检查 ios::eofbit、ios::badbit、ios::failbit 和 ios::goodbit。

测试流状态的较好方法是使用成员函数eof、bad、fail和good,使用这些函数不需要程序员熟知特定的状态位。

成员函数clear通常用于把—个流的状态恢复为“好”,从而可以对该流继续执行I/O操作。由于clear的默认参数为ios::goodbit,所以下列语句:

cin.clear();

清除 cin,并为流设置 goodbit。下列语句:

cin.clear(ios::failbit)

实际上给流设置了failbit。在用自定义类型对cin执行输入操作或遇到问题时,用户可能需要这么做。clear 这个名字用在这里似乎并不合适,但规定就是如此。
图11.29中的程序演示了成员函数 rdstate、eof、fail、bad、good 和 clear 的使用。

只要badbit和failbit中有一个被置位,成员函数operator!就返回true。只要 badbit 和 failbit 中有一个被置位,成员函数 operator void* 就返回 false。这些函数可用于文件处理过程中测试选择结构或循环结构条件的 true/false 情况。

1 // Fig. 11.29: fig11_29.cpp
2 // Testing error states.
3 #include <iostream.h>
4
5 int main()
6 {
7 int x;
8 cout << "Before a bad input operation:"
9 << "\ncin.rdstate(): " << cin.rdstate()
10 << "\n cin.eof(): "<< cin.eof()
11 << "In cin.fail(): "<< cin.fail()
12 << "\n cin.bad(): " << cin.bad()
13 << "\n cin.good(): "<< cin.good()
14 << "\n\nExpects an integer, but enter a character: ";
15 cin >> x;
16
17 cout << "\nEnter a bad input operation:"
18 << "\ncin.rdstate(): "<< cin.rdstate()
19 << "\n cin.eof(): "<< cin.eof()
20 << "\n cin.fail(): " << cin.fail()
21 << "\n cin.bad(): "<< cin.badO
22 << "\n cin.geed() " << cin.good() << "\n\n";
23
24 cin.clear();
25
26 cout << "After cin.clear()"
27 << "\ncin.fail(): "<< cin.fail()
28 << "\ncin.good(): "<< cin.good{) << endl;
29 return 0;
30 }

输出结果:

Before a bad input operation:
cin.rdstate(): 0
cin.eof(): 0
cin.fail() 0
tin.bad(): 0
cin.good(): 0

Expects an integer, but enter a character: A

After a bad input operation:
cin.eof(): 0
cin.fail(): 2
cin.bad(): 0
cin.good(): 0

After cin.clear()
cin. fail():0
cin.good(): 1

图 11.29 测试错误状态