添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
ifstream f;f.open(fileName);if ( f.fail() ){    // I need error message here, like "File not found" etc. -    // the reason of the failure}如何获取错误消息作为字符串?
查看完整描述

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";

}


查看完整回答