3 回答
TA贡献1828条经验 获得超3个赞
每个失败的系统调用都会更新该errno值。
因此,您可以ifstream通过使用类似以下内容的信息来进一步了解打开失败时发生的情况:
cerr << "Error: " << strerror(errno);
但是,由于每个系统调用都会更新全局errno值,因此如果另一个系统调用在的执行f.open和使用之间触发了错误,则在多线程应用程序中可能会出现问题errno。
在具有POSIX标准的系统上:
errno是线程本地的;在一个线程中设置它不会影响在其他任何线程中的值。
编辑(感谢Arne Mertz和其他人的评论):
e.what() 起初似乎是一种更符合C ++习惯的正确方法,但是此函数返回的字符串取决于实现,并且(至少在G ++的libstdc ++中)此字符串没有有关错误原因的有用信息...
TA贡献1850条经验 获得超11个赞
您可以尝试让流在失败时引发异常:
std::ifstream f;
//prepare f to throw if failbit gets set
std::ios_base::iostate exceptionMask = f.exceptions() | std::ios::failbit;
f.exceptions(exceptionMask);
try {
f.open(fileName);
}
catch (std::ios_base::failure& e) {
std::cerr << e.what() << '\n';
}
e.what(),但是似乎并没有太大帮助:
我在Embarcadero RAD Studio 2010 Win7上尝试过,它给出“ ios_base :: failbit set”,而strerror(errno)给出“没有这样的文件或目录”。
在Ubuntu 13.04上,gcc 4.7.3异常显示为“ basic_ios :: clear”(感谢arne)
如果e.what()对您不起作用(由于该错误未标准化,我不知道会告诉您什么错误),请尝试使用std::make_error_condition(仅C ++ 11):
catch (std::ios_base::failure& e) {
if ( e.code() == std::make_error_condition(std::io_errc::stream) )
std::cerr << "Stream error!\n";
else
std::cerr << "Unknown failure opening file.\n";
}
- 3 回答
- 0 关注
- 3616 浏览
添加回答
举报