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

标签 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;
}

最佳答案

当您创建流时,请注意,只要设置了 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 循环设置显式异常处理程序。

希望这对您有所帮助!

关于c++ - 为什么这个文件读取代码会产生异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20939731/

相关文章:

c++ - C++ 17 —将成员变量的类型映射到std::optionals

c++ - De-allcoating 动态分配的多维数组。

php - 如何在 PHP 7+ 中捕获可恢复的错误?

java - Apache poi word文档空指针异常

c++ - 为现有缓冲区提供 std::istream 接口(interface)而不复制它

c++ - 在条件之外使用短路运算符是否合法?

c++ - 具有多个参数的 Map.emplace C++ 17

java - 找不到 NotSerializedException 的来源

C++ 检测输入重定向

C++错误消息ostream未命名类型