为什么这个文件读取代码会产生异常?

时间:2014-01-05 21:57:54

标签: c++ exception iostream

我有一个函数(addShape)来根据它获得的id从文件中读取整数。它将id和流is作为参数。出于某种原因,我在阅读完最后一行后被std::ios_base::failure抛出。

while (is >> id)
    addShape(id, is, false);

我认为这是从文件中读取的最安全的方式。

这是我初始化流的方式:

fstream is;
int id = 0;
string filename;
char answer = NULL;

// set exceptions
is.exceptions(fstream::failbit | fstream::badbit);

try { is.open(filename); }

catch (ifstream::failure e)
{
    clrscr();
    cout << "There was an error opening " << filename << endl;
    waitForEscape();
    is.close();

    return;
}

1 个答案:

答案 0 :(得分:4)

当您创建流时,请注意,只要设置了failbit,您就会启用异常:

// set exceptions
is.exceptions(fstream::failbit | fstream::badbit);

这意味着只要流操作设置failbit,流就会抛出异常。

现在,看看这段代码:

while (is >> id)
    addShape(id, is, false);

在某些时候,读取is >> id将失败,原因可能是数据耗尽或数据格式错误。如果在关闭例外的情况下发生这种情况,则设置failbit并让is >> id评估为false,停止循环会失败。但是,如果启用了异常,则在这种情况下设置failbit时,它将引发异常。

根据您的目的,您可以

  • 未设置failbit的例外情况,这会导致错误发生时循环停止运行,或
  • 围绕while循环设置显式异常处理程序。

希望这有帮助!