当 C++ 流打开失败时,有什么方法可以获得特定的错误条件?也就是说,它是否因为文件不存在而失败,或者权限错误等等。基本上我正在寻找与普通 C 中 fopen() 的 errno 等效的功能。
GCC 似乎正确设置了 errno,但这似乎不是 C++ 标准所要求的,我无法确定这是否只是他们实现流的方式的产物,还是故意的特性(因此我不知道它是否会跨版本持续存在)。
有没有办法可靠地获取这些信息,无论是在标准 C++ 中还是在一个或多个主要编译器中非偶然?
出于一般原因,您可以查看 ios 标志(badbit、eofbit、failbit、goodbit)。使用 ios::bad()、ios::fail()、ios::eof() 或 ios::good() 测试将更容易。也可以使用 ios::exceptions() 将流设置为在错误时生成异常。
正如您为 GCC 指出的那样,在某些实现中可能会提供详细的 I/O 错误报告。对于不同的编译器,您可能不得不依赖此行为。如果有机会使用多个编译器,请确保测试并可能包含预处理器语句以检查当前编译器等。
据我所知,它讨论的唯一其他地方是提议的 TR2 添加。
在 Visual Studio fopen 等中设置最后一个错误代码值。可以使用GetLastError()检索它。结果将是这些值之一。