是否可以在不设置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/

10-10 11:24