9

考虑以下代码:

    ifstream in;
    try {
        in.exceptions ( ifstream::failbit | ifstream::badbit );
        in.open(pConfLocation);
    } catch ( ifstream::failure e ) {
        throw std::runtime_error("Can't open configuration file\n");
    }

    vector<string> lns;
    string s;

    in.clear();
    while ( !in.eof() ){
        getline( in, s );
        boost::algorithm::trim(s);
        lns.push_back( s+='\n');
    }

所以:

  1. 我为 try-catch 块的需要设置了以下“异常掩码”( ifstream::failbit | ifstream::badbit )。该文件打开没有问题。
  2. 在 while{} 块中,我知道将在文件末尾设置 eofbit。

异常掩码是所有流对象的内部值,用于指定哪些状态标志在设置时必须引发异常。

我没有设置ifstream::eofbit,但无论如何在运行时出现以下错误:

terminate called after throwing an instance of 'std::ios_base::failure'
  what():  basic_ios::clear
The program has unexpectedly finished.

我无法理解这种行为。我尝试在while{}之前使用in.clear()但没有效果。clear() 本身设置goodbit,据我了解,“标志必须抛出异常”(参见上面的引用),但是当googbit设置时,它不会导致抛出任何异常......</p>

如果要删除

        in.exceptions ( ifstream::failbit | ifstream::badbit );

有用。


在这种情况下如何使 getline() 工作?

4

1 回答 1

8

问题出在您的输入迭代中。eofbit仅在最后一次读取到达 EOF 时设置,如果下一次读取将仅读取 EOF,则不会设置。当后者发生时,failbit同时设置。请参阅此处的讨论。

在您的特定情况下,如果文件以换行符结尾(可能是这样),则getline()读取并包含该换行符并返回。eofbit仍然没有设置。然后下一个getline()直接遇到 EOF,根据它的文档,“如果函数没有提取任何元素,它会调用setstate(failbit).”。

于 2012-11-30T18:38:05.593 回答