【问题标题】:getline() throws basic_ios::clear exception after reading the last linegetline() 读取最后一行后抛出 basic_ios::clear 异常
【发布时间】:2017-03-26 11:32:46
【问题描述】:

我正在为使用 qtestlib、C++(clang LLVM 8.0 版)读取文件编写单元测试。我有以下代码用于逐行读取文件。

std::ifstream infile;

try {
    infile.open(path.c_str());
    std::ios_base::iostate exceptionMask = infile.exceptions() | std::ios::failbit;
    infile.exceptions(exceptionMask);

} catch (std::ios_base::failure& e) {
    // print the exception
    qDebug() << "Exception caught: " << QString::fromStdString(e.what());
}

try {
    std::string line;
    while (std::getline(infile, line)) {
        // print the line
        qDebug() << QString::fromStdString(line);
    }

} catch (std::ios_base::failure& e) {
    qDebug() << "Exception caught: " << QString::fromStdString(e.what());
}

问题

上面的代码读取文件中的所有行并打印出来。但是在打印最后一行之后,它会抛出异常并打印以下内容,

捕获的异常:“basic_ios::clear”

我关注了很多线程,但找不到解决方案。为什么会出现此错误?

【问题讨论】:

    标签: c++ qt exception-handling


    【解决方案1】:

    在您阅读并打印完所有行之后,while (std::getline(infile, line)) 仍会尝试读取另一行。如果它完全失败 - 读取零个字符 - 它设置failbit 以表示它的失败。

    错误消息的奇怪部分是,尽管它的名称,basic_ios::clear 可用于设置失败位,并且如果您使用 exceptions 启用了相同的位,也会引发异常。

    【讨论】:

    • 我不知道我必须重新设置它。谢谢!
    【解决方案2】:

    查看std::getline 的文档。关于设置标志的部分:

    故障

    获得的输入无法解释为此类对象的有效文本表示。在这种情况下, distr 保留调用前的参数和内部数据。请注意,某些 eofbit 情况也会设置 failbit

    最后一句话有点模糊,但可以解释观察到的行为。

    我做了一些实验并找到了规律。首先,我以这种方式更正了您的代码:

    try {
        std::string line;
        while (std::getline(infile, line)) {
            // print the line
            qDebug() << QString::fromStdString(line);
            if (infile.eof()) {
                return;
            }
        }
    
    } catch (std::ios_base::failure& e) {
        qDebug() << "Exception caught: " << QString::fromStdString(e.what());
    }
    

    现在如果输入文件以空行结尾我会得到一个异常,如果最后一行不以“\n”结尾return 会中断循环。

    如果您尝试读取已经到达流末尾的流,则设置 falbit。 如果没有“if”检查,你总是在做这个阅读并且总是得到一个异常。

    对于最后一行空我有一些线索,但不知道如何很好地解释它。首先必须检查其他平台/编译器的行为。

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2015-07-18
      • 2021-05-13
      相关资源
      最近更新 更多