【问题标题】:Can "eof" be set in ofstream?可以在 ofstream 中设置“eof”吗?
【发布时间】:2019-02-23 13:05:49
【问题描述】:

我几乎找不到这方面的任何信息。是否,如果可以,在什么情况下可以设置eofbit(意思 ofstream_instance.eof() 为true)?

我对独立的 ofstream 更感兴趣,它与某个 fstream 中的 ifstream 不相关,因此 ifstream 无法设置“共享”eofbit(如果可能的话)。

如果我只是写入一个文件并且磁盘上没有空间或操作系统没有为写入提供另一个空间,那么我希望只设置失败位或坏位,但在到达文件末尾时给它写信对我来说没有意义。但是我没有找到关于这个的讨论。

【问题讨论】:

  • 我还是不明白为什么必须在std::ofstream 中设置eof 位。如果您 close() std::ofsteam 并且它没有失败,我会假设输出成功。不过,我在某处读到这只是“高于”操作系统级别的真实情况。为硬盘授予此权限可能需要更多的努力(除了标准 C++),例如做一个fsync()。 (我的胃是对的 - 找到了:)SO: How do I ensure data is written to disk before closing fstream?

标签: c++ fstream ofstream


【解决方案1】:

否。 eof() 返回 eofbit,这对于没有关联输入流的输出流没有实际意义。

eofbit 表示输入操作已到达输入序列的末尾

[ios.types] / 3.1,表 107

设置eofbit 的动作被枚举为here,它们都只作用于输入流。

我们可以想象一些奇怪的特定于实现的场景,其中 EOF(与其他一些错误条件相反)会在写入文件时被命中 - 也许我们正在通过某些操作系统函数写入固定大小的文件缓冲区- 但据我所知,标准库抽象并不处理这种情况,而且我一开始从未见过或听说过这样的 API。

【讨论】:

  • 我一直在想,例如在 FAT32 文件系统上,当达到 4GB 标记时,可能会强制执行 EOF。但这似乎不太可能,我只是在“大声”思考。
  • 在那张纸条上,当 POSIX write 发生这种情况时,有一个 EFBIG 的 errno。我想这会映射到failbitbadbit,因为通常这是一个错误(与 EOF 相反,这是正常和预期的行为)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多