我有一个 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/