猿问

ifstream打开失败时如何获取错误消息

ifstream f;

f.open(fileName);


if ( f.fail() )

{

    // I need error message here, like "File not found" etc. -

    // the reason of the failure

}

如何获取错误消息作为字符串?


精慕HU
浏览 3618回答 3
3回答

子衿沉夜

每个失败的系统调用都会更新该errno值。因此,您可以ifstream通过使用类似以下内容的信息来进一步了解打开失败时发生的情况:cerr << "Error: " << strerror(errno);但是,由于每个系统调用都会更新全局errno值,因此如果另一个系统调用在的执行f.open和使用之间触发了错误,则在多线程应用程序中可能会出现问题errno。在具有POSIX标准的系统上:errno是线程本地的;在一个线程中设置它不会影响在其他任何线程中的值。编辑(感谢Arne Mertz和其他人的评论):e.what() 起初似乎是一种更符合C ++习惯的正确方法,但是此函数返回的字符串取决于实现,并且(至少在G ++的libstdc ++中)此字符串没有有关错误原因的有用信息...

慕盖茨4494581

您可以尝试让流在失败时引发异常:std::ifstream f;//prepare f to throw if failbit gets setstd::ios_base::iostate exceptionMask = f.exceptions() | std::ios::failbit;f.exceptions(exceptionMask);try {&nbsp; f.open(fileName);}catch (std::ios_base::failure& e) {&nbsp; 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) {&nbsp; if ( e.code() == std::make_error_condition(std::io_errc::stream) )&nbsp; &nbsp; std::cerr << "Stream error!\n";&nbsp;&nbsp; else&nbsp; &nbsp; std::cerr << "Unknown failure opening file.\n";}
随时随地看视频慕课网APP
我要回答