ifstream :: close重置failbit和/或badbit吗?

时间:2015-09-29 00:03:48

标签: c++ error-handling fstream

调用ifstream::close是否重置了流failbit和/或badbit,类似于调用clear?这不是this question的重复 - 我需要知道标志是否重置,而不仅仅是当他们设置时。

例如,我在当前项目中使用了以下if-else之类的内容:

ifstream myInputStream("foo.txt");

//Let's pretend this compiles all the time, even though it
//might not because the operator is ambiguous.
myInputStream << "Outputting to an input stream causes problems."

if (myInputStream.fail())
{
   cout << "Aw, nuts. It failed." << endl;
   myInputStream.close();
   return false;
}
else
{
   cout << "No nuts here. Only chocolate chips." << endl;
   myInputStream.close();
   return true;
}

在每个分支机构拨打myInputStream.close之后,我是否必须接听myInputStream.fail的电话才能获得准确的支票?或者这会有效:

ifstream myInputStream("foo.txt");

myInputStream << "Outputting to an input stream causes problems.";    

myInputStream.close();

if (myInputStream.fail())
{
   cout << "Aw, nuts. It failed." << endl;
   return false;
}
else
{
   cout << "No nuts here. Only chocolate chips." << endl;
   return true;
}

我知道ifstream::close本身设置 failbitbadbit如果关闭失败,这是我想在检查失败之前调用它的一个原因 - 无论是什么导致它我都需要返回false。如果关闭只进行一次,它看起来也不那么混乱。

TL;博士;

ifstream::close 重置 failbitbadbit是否还有其他设置,让我的第二个代码示例返回true?

2 个答案:

答案 0 :(得分:5)

close()不应该清除任何状态标志,尽管它可能会设置failbit,具体取决于底层缓冲区的返回值。

[fstream.members](也是[ifstream.members]和[ofstream.members])

  

void close();

     

效果:调用rdbuf()->close(),如果该函数返回返回空指针,则调用setstate(failbit)(27.5.5.4)(可能会抛出ios_base::failure)。

标志 open()清除,但假设filebuf正确打开

  

void open(const char* s, ios_base::openmode mode = ios_base::in|ios_base::out);

     

效果:致电rdbuf()->open(s,mode)。   如果该函数没有返回空指针调用clear(),   否则调用setstate(failbit),(可能会抛出ios_base::failure)   (27.5.5.4)。

答案 1 :(得分:1)

使用问题中的示例代码(修改后使用g ++编译),看起来ifstream::close 重置failbit。我不知道badbit,但是如果设置了ios::fail则返回true。

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

int main()
{
   ofstream writer("foo.txt");

   writer << "These are not integers.";

   writer.close();

   ifstream myInputStream("foo.txt");

   int i;
   myInputStream >> i;//This should set the failbit.

   myInputStream.close();//Will this reset it?

   if (myInputStream.fail())
   {
      cout << "Aw, nuts. It failed." << endl;
      return false;
   }
   else
   {
      cout << "No nuts here. Only chocolate chips." << endl;
      return true;
   }
}

输出:噢,坚果。它失败了。

myInputStream.fail()返回false。