C 文件处理:ios::app 和 ios::ate 之间的区别?

新手上路,请多包涵

写入文件时 ios::ateios:app 有什么区别。

在我看来, ios::app 使您能够在文件中四处移动,而使用 ios::ate 它只能在文件末尾读取/写入。这个对吗?

原文由 Adam_G 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

这是相反的方式。当设置了 ios::ate 时,初始位置将是文件的末尾,但之后您可以自由寻找。当设置了 ios::app 时, 所有 输出操作都在文件末尾执行。由于所有写入都隐含在搜索之前,因此无法在其他地方写入。

原文由 Jon Purdy 发布,翻译遵循 CC BY-SA 3.0 许可协议

我在这里添加了一个答案,因为我最近遇到了 ios::ate 应该可以工作的情况,但是关于这个主题的大多数在线文档,比如 cplusplus.com 上的 这个 页面,以及这篇文章中的类似答案结果只是部分正确或至少具有误导性。

每个人都正确的是 ios::app 将打开一个文件而不删除其内容,并在每次写入文件之前将光标移动到文件的末尾。因此,当使用 ios::app 打开文件时,使用像 seekp 这样的函数或多或少没用,因为在写入发生之前,每次写入时光标都会自动移动到文件的末尾。

每个人都正确的是 ios::ate 在每次写入之前不会将光标移动到文件的末尾。所以像 seekp 这样的函数可以与 ios::ate 一起使用。在技术上也是正确的,当您打开文件时, ios::ate 会将光标移动到文件的末尾,但这是一个技术问题——请参阅下一段。

与大多数文档和论坛答案不相符的是,实际上(如果他们对我的经验有合理的解释,请发表评论)使用 ios::ate 打开文件将删除其内容,就像 ios::trunc。如果您想打开一个非空文件进行写入,而不是删除其内容,并保留有效移动流位置的能力,就像 seekp 一样,这给您留下的选择不多。

我发现解决我的问题的唯一方法是使用我在 这篇 Stack Overflow 帖子中找到的解决方案,即使用标志 (ios::in | ios::ate) 打开文件,即使我正在为写作。这让我有点不舒服,但这是我现在正在做的事情。

原文由 23r0c001 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题