写入文件时 ios::ate
和 ios:app
有什么区别。
在我看来, ios::app
使您能够在文件中四处移动,而使用 ios::ate
它只能在文件末尾读取/写入。这个对吗?
原文由 Adam_G 发布,翻译遵循 CC BY-SA 4.0 许可协议
写入文件时 ios::ate
和 ios:app
有什么区别。
在我看来, ios::app
使您能够在文件中四处移动,而使用 ios::ate
它只能在文件末尾读取/写入。这个对吗?
原文由 Adam_G 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
这是相反的方式。当设置了
ios::ate
时,初始位置将是文件的末尾,但之后您可以自由寻找。当设置了ios::app
时, 所有 输出操作都在文件末尾执行。由于所有写入都隐含在搜索之前,因此无法在其他地方写入。