C++详细的错误测试

核心概念:所有的流对象都有错误状态位,表示流的状态。

所有流对象都包含一组充当标志的位。这些标志表示流的当前状态。

文件状态位标志

位        描述

ios::eofbit  在遇到输入流结束时设置。

ios::failbit  当尝试的操作失败时设置。

ios::hardfail  当发生不可恢复的错误时设置。

ios::badbit  当试图进行无效操作时进项设置。

ios::goodbit  当所有上面的标志没有设置时设置。表示流状态良好。

上述位可以通过以下列出的成员函数进行测试。其中clear()函数可用于设置状态位:

报告位标志的成员函数

函数        描述

eof()    如果设置了eofbit标志,则返回true(非零);否则返回false。

fail()    如果设置了failbit或hardfail标志,则返回true(非零);否则返回false。

bad()        如果设置了badbit标志,则返回true(非零);否则返回false。

good()   如果设置了goodbit标志,则返回true(非零);否则返回false。

clear()   当不带参数调用时,清楚上面列出的所有标志。也可以用特定的标志作为参数来调用。

测试代码:

#include <iostream>
#include <fstream>
using namespace std;

//Function prototype
void showState(fstream & );

int main()
{
  fstream testFile("stuff.dat", ios::out);
  if(testFile.fail())
  {
    cout<<"Cannot open the file.\n";
    return 0;
  }
  int num = 0;
  cout<<"Writting to the file.\n";
  testFile<<num;
  showState(testFile);
  testFile.close();

//Open the same file, read the number, show status
  testFile.open("stuff.dat",ios::in);
  if(testFile.fail())
  {
    cout<<"cannot open the file.\n";
    return 0;
  }
  cout<<"Reading from the file.\n";
  testFile>>num;
  showState(testFile);

//Attempt an invalid read, and show status
  cout<<"Forcing a bad read operator.\n";
  testFile>>num;
  showState(testFile);

//close file and quit
  testFile.close();
  return 0;
}


void showState(fstream &file)
{
cout<<"File Status:\n";
cout<<" eof bit: "<<file.eof()<<endl;
cout<<" fail bit: "<<file.fail()<<endl;
cout<<" bad bit: "<<file.bad()<<endl;
cout<<" good bit: "<<file.good()<<endl;
file.clear(); //清楚所有不良位
}

结果:

C++详细的错误测试