首页 > 解决方案 > 如何使 getline 与 ios::exceptions 一起玩得很好?

问题描述

我正在尝试使用ifstream我需要能够循环使用getline但希望使用以下方法抛出异常ios::exceptions

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream f;
    f.exceptions( std::ifstream::failbit | std::ifstream::badbit );

    try {
        f.open("data/all-patents.dat", std::ifstream::in);
    }
    catch (std::ifstream::failure e) {
        std::cout << "Caught exception opening: " << e.what() << "\n";
    }
    
    std::string l;
    while (!std::getline(f, l).eof()) {
        // do something
    }

}

但是当getline遇到 EOF 时,它会抛出一个异常:

terminate called after throwing an instance of 'std::__ios_failure'
  what():  basic_ios::clear: iostream error

Program received signal SIGABRT, Aborted.
0x00007ffff7ad8615 in raise () from /usr/lib/libc.so.6

我可以通过抓住它来确认:

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream f;
    f.exceptions( std::ifstream::failbit | std::ifstream::badbit );

    try {
        f.open("data/all-patents.dat", std::ifstream::in);
    }
    catch (std::ifstream::failure e) {
        std::cout << "Caught exception opening: " << e.what() << "\n";
    }
    
    std::string l;
    try {
        while (!std::getline(f, l).eof()) {
            // do something
        }
    }
    catch (std::ifstream::failure e) {
        std::cout << "Caught exception reading: " << e.what() << "\n";
    }

}

输出:Caught exception reading: basic_ios::clear: iostream error

ifstream::eofbit尽管我没有使用inios::exceptions的掩码,为什么 EOF 会引发异常?有没有一种方法可以让我继续使用ios::exceptions而不必将我的while循环包含在一个try?

标签: c++exceptionifstreameofgetline

解决方案


您打开抛出异常failbit,稍后当std::getline(f, l)无法提取它将设置failbit的触发异常的任何字符时。


推荐阅读