为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
精慕HU 2019-11-30 15:05:24
ifstream f;f.open(fileName);if ( f.fail() ){    // I need error message here, like "File not found" etc. -    // the reason of the failure}如何获取错误消息作为字符串?
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

每个失败的系统调用都会更新该errno值。


因此,您可以ifstream通过使用类似以下内容的信息来进一步了解打开失败时发生的情况:


cerr << "Error: " << strerror(errno);

但是,由于每个系统调用都会更新全局errno值,因此如果另一个系统调用在的执行f.open和使用之间触发了错误,则在多线程应用程序中可能会出现问题errno。


在具有POSIX标准的系统上:


errno是线程本地的;在一个线程中设置它不会影响在其他任何线程中的值。


编辑(感谢Arne Mertz和其他人的评论):


e.what() 起初似乎是一种更符合C ++习惯的正确方法,但是此函数返回的字符串取决于实现,并且(至少在G ++的libstdc ++中)此字符串没有有关错误原因的有用信息...


查看完整回答
反对 回复 2019-11-30
?
慕盖茨4494581

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

}


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 3616 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信