fstream:检查错误的最正确方法

问题描述 投票:1回答:3

我想为fstream类编写一个包装器。如我所见,检查流是否工作正常的最常见方法是查看good()函数的结果。但是,我听说这主要是历史函数,使用它并不是真的安全(更正确地说,在某些情况下,流无法正常运行,但函数返回true。因此,我想喜欢分享经验并从他人那里了解检查fstream是否有错误的最正确方法。

如果有可能检查不同类型的错误,例如文件不存在,只能打开以供读取等,那将是非常好的。此外,还必须使此类程序处于跨平台状态(但是,主要目标是Linux)。

提前感谢!

c++ exception error-handling io fstream
3个回答
1
投票

如果文件操作失败,并且eof()返回false,则可以检查errnoerrno(取决于平台)以找出问题所在。


1
投票

我实际上只有两个建议,它们都依赖于使用重载的GetLastError运算符的返回值检查打开的流。使用仅输入模式,仅检查文件是否存在:

GetLastError

使用计划中的输入/输出模式打开,以防止在执行写操作时被截断:

!

默认情况下,这些是各个流的输入参数,但为清楚起见,我已明确显示它们。

在读/写操作中检查eof等期间,char name[] = "C:\\some_folder\\some file.txt"; std::ifstream f; f.open(name, std::ios::in); if (!f) printf("File does not exist, or inadequate permissions"); f.close(); 的第一个答案看起来很有见地。


0
投票

std::fstream f; f.open(name, std::ios::in | std::ios::out); if (!f) printf("Could not open file"); f.close(); / this question”仅测试仅覆盖somegood(),并且大多数情况下无法恢复错误。要检查错误,您需要同时检查bad()badbit。有关何时设置这些位的更多详细信息,请参见failbit

要检查错误,请使用badbit,它同时检查iosstateiosstate

fail()

C ++流还使fail()重载以返回failbit,因此您可以简单地这样做

badbit

然后您可以从 if (stream.fail()) { /* handle error ... */ } 中获取最后一个错误,并使用operator bool将其转换为文本:

bool

请注意,!fail()包含 if (!stream) { /* handle error ... */ } (在EOF上尝试读取将同时设置两个位),因此,要检查读取错误,您需要排除errno

errno
© www.soinside.com 2019 - 2024. All rights reserved.