gpt4 book ai didi

c++ - fstream.close() 和后续的 .open() 对 iostate 位有何影响?

转载 作者:太空狗 更新时间:2023-10-29 20:58:43 26 4
gpt4 key购买 nike

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

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

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

最佳答案

来自 [ifstream.members]/5:

void close();

Effects: Calls rdbuf()->close() and, if that function returns a null pointer, calls setstate(failbit) (which may throw ios_base::failure (27.5.5.4)).

总结 [filebuf.members]/6:

basic_filebuf<charT,traits>* close();

  • If is_open() == false, returns a null pointer.
  • If any of the calls made by the function [...] fails, close fails by returning a null pointer.
  • If a put area exists, calls overflow(traits::eof()) to flush characters.
  • If the last virtual member function called on *this (between underflow, overflow, seekoff, and seekpos) was overflow then calls a_codecvt.unshift
  • Finally [...] the function closes the file (as if by calling std::fclose(file))

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

  • codecvt::out如果 codecvt 则失败“遇到无法转换的字符”([locale.codecvt.virtuals]/5)。
  • 文件输出失败(未指定,可能是因为 fwrite 在大多数实现中失败)。

codecvt::unshift如果“发生未指定的错误”([locale.codecvt.virtuals]/8),则失败。

std::fclose “如果检测到任何错误”失败。 (C11 7.21.5.1)。

In particular, can I check .fail() after .close() to determine whether I should ::remove the file?

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com