【问题标题】:Can you get a specific error condition when a C++ stream open fails?当 C++ 流打开失败时,您可以获得特定的错误情况吗?
【发布时间】:2010-09-23 04:03:54
【问题描述】:

当 C++ 流打开失败时,有什么方法可以获取特定的错误情况?也就是说,它是否因为文件不存在或权限错误等而失败。基本上我正在寻找与普通 C 中 fopen() 的 errno 等效的功能。

GCC 似乎正确设置了 errno,但这似乎不是 C++ 标准所要求的,我无法确定这只是他们实现流的方式的产物,还是故意的特性(因此我不知道是否会跨版本持续存在)。

有没有办法可靠地获取此信息,无论是在标准 C++ 中还是在一个或多个主要编译器中非偶然?

【问题讨论】:

    标签: c++ stream


    【解决方案1】:

    出于一般原因,您可以查看 ios 标志(badbit、eofbit、failbit、goodbit)。 使用 ios::bad()、ios::fail()、ios::eof() 或 ios::good() 测试将更容易。 也可以使用 ios::exceptions() 将流设置为在错误时生成异常。

    详细的 I/O 错误报告可能在某些实现中可用,正如您针对 GCC 指出的那样。对于不同的编译器,您可能不得不依赖此行为。如果有机会使用多个编译器,请确保测试并可能包含预处理器语句以检查当前编译器等。
    据我所知,讨论的唯一其他地方是proposed TR2 additions

    【讨论】:

      【解决方案2】:

      在 Visual Studio fopen 等中设置最后一个错误代码值。可以使用GetLastError() 检索它。结果将是these 值之一。

      【讨论】:

      • 你有任何链接到 VS 文档中的位置吗?我一直在查看 MSDN 上的流页面,但我找不到任何关于这种行为的提及。我并不是说它不能这样工作,但最好能看到一些官方文档。
      • 我认为它没有在 VS 文档中列出。或者也许我的 google-foo 太弱了。但是,我确实发现了几个论坛帖子支持我的回忆,即 fopen 之类的都是围绕它们等效的 winapi 函数的包装器。所以 fopen 实际上是在调用 CreateFile,它设置了错误代码。无论如何,快速测试应该能够证明这一点(至少对于易于模拟文件错误而言)。我会自己做并发布结果。但是,唉,我目前无法轻松访问 Visual Studio。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2014-06-22
      • 2013-07-06
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多