C++语言程序设计

每一步操作后流的状态有下面五种：

| 表12-8

good | 流状态正常。
end-of-file | 表明输入操作到达输入序列尾部。
fail | 表明出现了格式化问题或者不影响缓冲区的其他问题，如果fail位被清除，流还是可用的。
bad | 表明缓冲区出现错误，数据丢失。
hardfail | 出现不可恢复性错误。

iostream提供了一些成员函数，如good()、fail()等来查询当前流的状态，下表列出了所有用于状态查询的成员函数。

| 表12-9

int rdstate() | 返回当前状态。
int good() | 若未设置错误状态时返回非零值。
int eof() | 当end-of-file位设置时，返回非零值。通常在执行过程中遇到文件的末尾时设置。不能从缓冲区读入更多的字符，也不能向缓冲区输出更多的字符。
int fail() | 当fail、bad或hardfail位设置时，返回非零值。
int bad() | 当bad或hardfail位设置时，返回非零值。
int operator!() | 当流状态非正常时，返回非零值。

在对流进行操作时，我们应该先对流的状态进行检测，以确保流的状态正常，通常的做法是：
if (!(cout << "Hello World !"))
handle_error();
使用插入或者抽取运算符的优点就是用户可以把插入或者抽取操作成组进行。例如，
int n=5;
cout<<"n="<<n;
if (!cout) handle_error();
这样可以使程序简洁明了，但是随之会产生一个问题：用户不可能在每次流操作结束后检测流的状态。C++的例外可以解决这个问题，因此标准iostream允许使用例外处理流错误。