2014-01-05 136 views
1

我有一个函数(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

你能告诉我们你是如何初始化'is'流和'addShape'的代码吗?您可能在流对象上启用了异常。 – templatetypedef

回答

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循环。

希望这有助于!

+0

如果文件无法打开,我想要发生异常,是否可以在文件打开后关闭异常? – Quaker

+3

@ Quaker-是的,应该可以通过调用'is.exceptions(0)'来实现。也就是说,如果你只是想抛出一个异常,如果一个操作失败,你可能会考虑把异常关闭,然后自己手动检查失败并在出现错误时抛出异常。这似乎是一个更优雅的解决方案。 – templatetypedef

相关问题