我应该期望CentOS6和CentOS7之间的fstream异常处理有不同的行为吗?

时间:2015-03-10 20:34:27

标签: c++ exception gcc centos fstream

我正在使用fstream对象从文件中读取数据,同时使用异常处理。由于逻辑的实现方式,代码将在fstream 之后执行tellg(),在文件结束时抛出fstream :: failure异常。此执行流程不一定是有意的,但在Windows(MSVS 2010)或CentOS6上运行时不会导致任何问题。但是,当在CentOS7上运行时,我得到一个核心转储。如果我在tellg()之前添加一个调用clear()fstream,那么一切都很好。

抛出的错误是:

  

在抛出' std :: ios_base :: failure'的实例后终止调用   what():basic_ios :: clear

有人可以提供关于这种行为改变是否是预期的见解吗?

gcc和libstdc ++的适用版本是:

对于CentOS6:

  • gcc version 4.4.7 20120313(Red Hat 4.4.7-11)(GCC)
  • 的/ usr / lib64下/的libstdc ++。so.6.0.13

对于CentOS7:

  • gcc version 4.8.2 20140120(Red Hat 4.8.2-16)(GCC)
  • 的/ usr / lib64下/的libstdc ++。so.6.0.19

解决问题的代码示例如下:

#include <fstream>
#include <iostream>

using namespace std;

int main()
{
   fstream in;
   in.exceptions(ifstream::failbit);

   cout << "Before open" << endl;
   in.open("in.txt", ios::in);
   cout << "After open" << endl;

   try
   {
      string s;
      while ( 1 )
      {
         getline(in, s);
         cout << s << endl;
      }
   }
   catch(fstream::failure e)
   {
      cout << "EOF Exception." << endl;
   }
   catch(...)
   {
      cout << "Unhandled Exception." << endl;
   }

   // --- uncomment this to make it work ---  in.clear();
   in.tellg();

   return 0;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

PR 26211所示,GCC 4.6.0实现了DR 419的解析,因此新行为是有意的。

标准中存在缺陷,已修复,因此GCC的库已更改为符合标准中的新规范。