我正在使用fstream对象从文件中读取数据,同时使用异常处理。由于逻辑的实现方式,代码将在fstream 之后执行tellg(),在文件结束时抛出fstream :: failure异常。此执行流程不一定是有意的,但在Windows(MSVS 2010)或CentOS6上运行时不会导致任何问题。但是,当在CentOS7上运行时,我得到一个核心转储。如果我在tellg()之前添加一个调用clear()fstream,那么一切都很好。
抛出的错误是:
在抛出' std :: ios_base :: failure'的实例后终止调用 what():basic_ios :: clear
有人可以提供关于这种行为改变是否是预期的见解吗?
gcc和libstdc ++的适用版本是:
对于CentOS6:
对于CentOS7:
解决问题的代码示例如下:
#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;
}
感谢您的帮助!