调用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
本身设置 failbit
或badbit
如果关闭失败,这是我想在检查失败之前调用它的一个原因 - 无论是什么导致它我都需要返回false。如果关闭只进行一次,它看起来也不那么混乱。
ifstream::close
重置 failbit
或badbit
是否还有其他设置,让我的第二个代码示例返回true?
答案 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。