我有一个 ofstream 对象,我会定期重新打开它,并使用新的文件名。我知道 .clear()iostate 重置为 goodbit 。但是,我不清楚这种状态是否受 .close.open 的影响。

特别是,我可以在 .fail() 之后检查 .close() 以确定我是否应该 ::remove 文件?我不想保留损坏或部分文件。

如果 badbit 和/或 failbit 不受 .close 的影响,我应该在调用 .clear 之前明确地对它们进行 .open(newPath) 吗?我已经发现这些位被 .open 清除,正式自 C++11 起,但非正式地大多数实现无论如何都是这样做的。

最佳答案

来自 [ifstream.members]/5:

总结[filebuf.members]/6:
overflow ([filebuf.members]/10) 在以下情况下失败:

如果 codecvt::out “遇到无法转换的字符”([locale.codecvt.virtuals]/5),

  • codecvt 将失败。
  • 文件输出失败(未指定,可能是 fwrite 在大多数实现中失败)。

  • 如果“发生了未指定的错误”([locale.codecvt.virtuals]/8),codecvt::unshift 将失败。std::fclose 失败“如果检测到任何错误。” (C11 7.21.5.1)。

    正如我们所见,如果文件本身存在问题,或者如果 codecvt 遇到无法转换的字符(或者在不太可能发生的 close 失败的情况下),unshift 可能会失败。如果您需要绝对确定 close 由于文件问题而失败,则需要在关闭之前执行类似 os.seekp(0, os.end).clear(); 的操作,以确保 close 所做的唯一事情就是调用 std::fclose

    关于c++ - fstream.close() 和后续的 .open() 对 iostate 位有何影响?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26887330/

    10-13 08:30