ios::exceptions(...) 在设置 badbit 时发生变化
ios::exceptions(...) changes when badbit is set
执行以下代码时,我得到以下输出:EOF FAIL。因此,从一个空文件中读取一行设置了 eofbit 和 failbit,但不是 badbit。
如果我通过取消注释第 11 行来启用异常,则输出会更改:EOF BAD FAIL。现在从一个空文件中读取一行设置 eofbit、badbit、但不是 failbit(否则发生异常)。
有人可以解释为什么启用异常会改变设置 failbit 和 badbit 的方式。这在某处记录了吗?
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char const *argv[]) {
ifstream f("some_empty_file");
string line;
// f.exceptions(std::ifstream::failbit); // (line 11)
getline(f, line);
if(f.eof()) cout << "EOF ";
if(f.bad()) cout << "BAD ";
if(f.fail()) cout << "FAIL ";
cout << endl;
f.close();
return 0;
}
编辑:我在 上阅读了关于 badbit 和 failbit 区别的答案。但这并没有回答这个问题,为什么在启用异常的情况下,从空文件中读取会变成“严重错误”,而如果我不调用 f.exceptions 则不是(...)
有 4 种不同的流状态(取自 std::ios_base::iostate):
typedef /*implementation defined*/ iostate;
static constexpr iostate goodbit = 0;
static constexpr iostate badbit = /*implementation defined*/
static constexpr iostate failbit = /*implementation defined*/
static constexpr iostate eofbit = /*implementation defined*/
因此 eofbit
的设置不一定会触发您的异常掩码。
执行以下代码时,我得到以下输出:EOF FAIL。因此,从一个空文件中读取一行设置了 eofbit 和 failbit,但不是 badbit。
如果我通过取消注释第 11 行来启用异常,则输出会更改:EOF BAD FAIL。现在从一个空文件中读取一行设置 eofbit、badbit、但不是 failbit(否则发生异常)。
有人可以解释为什么启用异常会改变设置 failbit 和 badbit 的方式。这在某处记录了吗?
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char const *argv[]) {
ifstream f("some_empty_file");
string line;
// f.exceptions(std::ifstream::failbit); // (line 11)
getline(f, line);
if(f.eof()) cout << "EOF ";
if(f.bad()) cout << "BAD ";
if(f.fail()) cout << "FAIL ";
cout << endl;
f.close();
return 0;
}
编辑:我在 上阅读了关于 badbit 和 failbit 区别的答案。但这并没有回答这个问题,为什么在启用异常的情况下,从空文件中读取会变成“严重错误”,而如果我不调用 f.exceptions 则不是(...)
有 4 种不同的流状态(取自 std::ios_base::iostate):
typedef /*implementation defined*/ iostate; static constexpr iostate goodbit = 0; static constexpr iostate badbit = /*implementation defined*/ static constexpr iostate failbit = /*implementation defined*/ static constexpr iostate eofbit = /*implementation defined*/
因此 eofbit
的设置不一定会触发您的异常掩码。