写入文件时 ios::ate和 ios:app的区别是什么。 在我看来,ios::app允许在文件中移动,而 ios::ate只能在文件末尾读/写。是这样吗?
ios::ate
ios:app
ios::app
它们具体如下(在 C + + 11的27.5.3.1.4中) :
app寻求在每次写之前结束 ate打开并寻求在打开后立即结束
app寻求在每次写之前结束
app
ate打开并寻求在打开后立即结束
ate
对于 ios::app,文件中的写入位置是“粘性的”——所有写入都在结尾,无论您在哪里查找。
恰恰相反。当 ios::ate设置,初始位置将是文件的结束,但您可以自由寻找之后。当设置 ios::app时,在文件的末尾执行 所有输出操作。因为所有的写作都隐含在寻找之前,所以没有办法在其他地方写作。
这是相当好的文件 给你。
ios::ate将流的位置指示器设置为开启时流的末端
在每次输出操作之前,将流的位置指示器设置为流的末尾
这意味着区别在于,当您打开文件时,ios::ate将您的位置放在文件的末尾。相反,每次刷新流时,ios::app都会将其放在文件的末尾。例如,如果有两个程序写入同一个日志文件,则 ios::ate将覆盖另一个程序自打开该文件以来添加到该文件中的任何内容。相反,每次程序添加日志条目时,ios:app都会跳到文件的末尾。
“我们不能移动指针,它只能在末尾。”
“我们可以将记录指针移动到任何其他地方。”
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)打开文件,即使我正在打开一个用于写作的 ofstream。这让我有点不舒服,但这就是我现在要做的。