2014-08-30 50 views
0

我有一段代码可以完成它打算做的工作,但我对failbit有所怀疑。虽然文件显示在屏幕上,但catch块始终运行。当达到eof时,为什么failbit被设置?也许我不了解失败位的正确含义..有什么失败的?为什么要设置失败位。文件似乎已经打印好了

int main() 
    { 
     ifstream infile; 
     char c; 
     infile.exceptions (ifstream::failbit); 

     try 
     { 
      infile.open("../Dose.c", ios::in); 
      while (!infile.eof()) 
      { 
       c=infile.get(); 
       cout << c; 
      } 
      infile.close(); 

     } 
     catch(ifstream::failure e) 
     { 
      cout << infile.eof() << " " << infile.fail() << " " << infile.bad() << " " << infile.good() ; 
      cerr << " Exception opening/reading/closing file\n"; 
     } 
    return 0; 
    } 

OUTPUT:1 1 0 0异常打开/读取/关闭文件。所以显然失败()和eof被设置。

+0

FWIW,'ios :: in'是不必要的,循环应该是'while(infile.get(c)){cout << c;}','infile.close();'是不必要的, 'return 0;'是不必要的,异常应该被const引用捕获。 – chris 2014-08-30 01:28:22

+0

是什么让你认为在失败之前已经达到了eof? [看到这个问题](https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – WhozCraig 2014-08-30 01:30:43

回答

1

27.5.5.4,第7段:

布尔EOF()const的; 返回:如果在rdstate()中设置了eofbit,则为true。

换句话说,所有的EOF()的作用是检查是否eofbit是已经集。它不会“主动”检查文件结尾是否已经到达。

跳过一堆干燥,形式化的规范,会发生什么是在get()内检测到文件结束条件。 eofbit首先被设置,然后failbit(get()操作失败)。由于您启用了异常,因此设置故障位的操作会引发异常。如果未启用异常,则get()将返回traits :: eof(),通常为-1,而不是从文件读取的字符。

外卖:

  1. 当使用异常,EOF()唯一的价值来自后的异常被抛出已,以确定异常是否是由于文件终止条件。在你的例子中,eof()永远不会返回true。
  2. 不使用异常时,不需要eof(),只需检查get()是否返回-1。
+0

所有我试图做的是打开文件与尝试catch块。那是我的意图。所以我可以做一些异常处理,因为文件不存在或打开时会发生一些错误。 – Angelo 2014-08-30 06:37:10

+0

您所要做的就是使用is_open()来检查文件是否成功打开。 – 2014-08-30 12:36:18

相关问题