是否可以在不设置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
最佳答案
你不能标准说关于getline
:
如果文件以空行结尾,即最后一个字符为'\n',则对getline的最后一次调用不会读取任何字符,并且会失败。确实,如果不设置故障位,您想如何使循环终止? while
的条件将始终为true,并将永远运行。
我认为您误解了故障位的含义。这并不意味着无法读取该文件。而是用作上一次操作成功的标志。为了指示低级故障,使用了badbit,但对于标准文件流却很少使用。通常,不应将failbit和eofbit解释为异常(exception)情况。另一方面,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;
}
关于c++ - 使用getline()而不设置failbit,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7855226/