ios::ate
写入文件和ios:app
写入文件有什么区别。
在我看来,ios::app
它使您能够在文件中移动,而ios::ate
它只能在文件末尾读/写。它是否正确?
6 回答
这是相反的方式。设置时ios::ate
,初始位置将是文件的末尾,但之后您可以自由寻找。ios::app
设置时,所有输出操作都在文件末尾执行。由于所有写入都隐含在搜索之前,因此无法在其他地方写入。
它们指定如下(在 C++11 的 27.5.3.1.4 中):
app
在每次写入之前寻求结束
ate
打开并在打开后立即结束
文件中的写入位置是“粘性的”——所有写入都在ios::app
最后,无论您在哪里寻找。
这里有很好的记录。
ios::ate
“将流的位置指示器设置为打开时流的末尾。”
ios::app
“在每次输出操作之前将流的位置指示器设置为流的末尾。”
这意味着不同之处在于,ios::ate
当您打开文件时,会将您的位置放在文件的末尾。ios::app
而是在每次刷新流时将其放在文件末尾。例如,如果您有两个程序写入同一个日志文件,ios::ate
则将覆盖自您的程序打开以来由另一个程序添加到文件中的任何内容。ios:app
每次您的程序添加日志条目时,都会跳转到文件末尾。
ios::app
--> “我们不能移动指针。它只会在末尾。”
ios::ate
--> "我们可以将记录指针移动到任何其他地方。"
该ios::ate
选项用于输入和输出操作,并
ios::app
允许我们将数据添加到文件末尾。
我在这里添加了一个答案,因为我最近遇到了 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) 打开文件,即使我正在为写作。这让我有点不舒服,但这是我现在正在做的事情。