是否可以使用getline()
在未设置failbit
的情况下阅读有效文件?我想使用failbit
,以便在输入文件不可读时生成异常。
以下代码始终输出basic_ios::clear
作为最后一行 - 即使指定了有效输入。
test.cc:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ifstream inf;
string line;
inf.exceptions(ifstream::failbit);
try {
inf.open(argv[1]);
while(getline(inf,line))
cout << line << endl;
inf.close();
} catch(ifstream::failure e) {
cout << e.what() << endl;
}
}
input.txt中:
the first line
the second line
the last line
结果:
$ ./a.out input.txt
the first line
the second line
the last line
basic_ios::clear
答案 0 :(得分:8)
你做不到。标准说明getline
:
如果该函数不提取任何字符,则会调用
is.setstate(ios_base::failbit)
,这可能会抛出ios_base::failure
(27.5.5.4)。
如果您的文件以空行结尾,即最后一个字符为'\ n',则最后一次调用getline不会读取任何字符并失败。实际上,如果不设置failbit,你是如何想要循环终止的呢? while
的条件总是正确的,它会永远运行。
我认为你误解了failbit的含义。 不意味着无法读取文件。它被用作最后一次操作成功的标志。为了表示低级故障,使用了badbit,但它几乎没有用于标准文件流。 failbit和eofbit通常不应被解释为例外情况。另一方面,badbit应该,并且我认为fstream :: open应该设置badbit而不是failbit。
无论如何,上面的代码应该写成:
try {
ifstream inf(argv[1]);
if(!inf) throw SomeError("Cannot open file", argv[1]);
string line;
while(getline(inf,line))
cout << line << endl;
inf.close();
} catch(const std::exception& e) {
cout << e.what() << endl;
}