写入文件时ios::ate和ios:app有什么区别?在我看来,ios::app允许您在文件中移动,而ios::ate只能在文件末尾读/写,这对吗?
ios::ate
ios:app
ios::app
kcrjzv8t1#
相反,当设置ios::ate时,初始位置将是文件的结尾,但之后您可以自由查找;当设置ios::app时,* 所有 * 输出操作都在文件的结尾执行。由于所有写入操作都隐含地在查找之前,因此无法在其他位置写入。
iecba09b2#
它们的规定如下(C++11的27.5.3.1.4):每次写入前app寻道结束ate打开并在打开后立即寻求结束对于ios::app,文件中的写入位置是“粘滞的”--所有写入都在末尾,无论您在哪里查找。
app
ate
ruyhziif3#
它是非常有据可查的here。ios::ate“将流的位置指示器设置为打开时的流结尾。”ios::app“在每个输出操作之前,将流的位置指示符设置为流的末尾。”这意味着不同之处在于ios::ate在您打开文件时将您的位置放在文件末尾。ios::app在每次刷新流时将您的位置放在文件末尾。例如,如果您有两个程序写入同一个日志文件,ios::ate将覆盖自您的程序打开文件以来由其他程序添加到文件中的任何内容。ios:app将改为在您的程序每次添加日志项时跳转到文件末尾。
h22fl7wq4#
ios::app--〉“我们无法移动指针。它将仅位于末尾。”ios::ate--〉“我们可以将记录指针移动到任何其他位置。”
n8ghc7c15#
我在这里补充一个答案,因为我最近遇到了一个情况,ios::ate应该可以工作,但是大多数关于这个主题的在线文档,比如www.example.com上的this页面cplusplus.com,以及这篇文章中的类似答案,结果只是部分正确,或者至少是误导。每个人都是正确的是ios::app会打开一个文件而不删除它的内容,并且在每次写入文件之前将光标移动到文件的末尾。因此,当文件已经用ios::app打开时,使用seekp这样的函数或多或少是无用的,因为在写入发生之前,光标会在每次写入时自动移动到文件的末尾。每个人都正确的是ios::ate不会在每次写操作之前把光标移到文件末尾,所以seekp这样的函数可以在ios::ate上使用,同样技术上正确的是ios::ate会在你打开文件时把光标移到文件末尾,但这是一个技术细节--见下一段。与大多数文档和论坛的回答不一致的是,在现实中(如果有人对我的经历有合理的解释,请发表评论)用ios::ate打开文件会删除其内容,就像ios::trunc一样。如果你想打开一个非空文件进行写入,而不是删除其内容,并保持有效移动流位置的能力,就像seekp一样,这给你留下了很多很好的选择。我发现解决问题的唯一方法是使用我在this Stack Overflow帖子中找到的解决方案,即打开带有标志的文件(ios::in| ios::ate),即使我正在打开一个ofstream来写,这让我有点不舒服,但这是我现在正在做的。
k75qkfdt6#
ios::ate选项用于输入和输出操作,ios::app允许我们将数据添加到文件末尾。
6条答案
按热度按时间kcrjzv8t1#
相反,当设置
ios::ate
时,初始位置将是文件的结尾,但之后您可以自由查找;当设置ios::app
时,* 所有 * 输出操作都在文件的结尾执行。由于所有写入操作都隐含地在查找之前,因此无法在其他位置写入。iecba09b2#
它们的规定如下(C++11的27.5.3.1.4):
每次写入前
app
寻道结束ate
打开并在打开后立即寻求结束对于
ios::app
,文件中的写入位置是“粘滞的”--所有写入都在末尾,无论您在哪里查找。ruyhziif3#
它是非常有据可查的here。
ios::ate
“将流的位置指示器设置为打开时的流结尾。”ios::app
“在每个输出操作之前,将流的位置指示符设置为流的末尾。”这意味着不同之处在于
ios::ate
在您打开文件时将您的位置放在文件末尾。ios::app
在每次刷新流时将您的位置放在文件末尾。例如,如果您有两个程序写入同一个日志文件,ios::ate
将覆盖自您的程序打开文件以来由其他程序添加到文件中的任何内容。ios:app
将改为在您的程序每次添加日志项时跳转到文件末尾。h22fl7wq4#
ios::app
--〉“我们无法移动指针。它将仅位于末尾。”ios::ate
--〉“我们可以将记录指针移动到任何其他位置。”n8ghc7c15#
我在这里补充一个答案,因为我最近遇到了一个情况,ios::ate应该可以工作,但是大多数关于这个主题的在线文档,比如www.example.com上的this页面cplusplus.com,以及这篇文章中的类似答案,结果只是部分正确,或者至少是误导。
每个人都是正确的是ios::app会打开一个文件而不删除它的内容,并且在每次写入文件之前将光标移动到文件的末尾。因此,当文件已经用ios::app打开时,使用seekp这样的函数或多或少是无用的,因为在写入发生之前,光标会在每次写入时自动移动到文件的末尾。
每个人都正确的是ios::ate不会在每次写操作之前把光标移到文件末尾,所以seekp这样的函数可以在ios::ate上使用,同样技术上正确的是ios::ate会在你打开文件时把光标移到文件末尾,但这是一个技术细节--见下一段。
与大多数文档和论坛的回答不一致的是,在现实中(如果有人对我的经历有合理的解释,请发表评论)用ios::ate打开文件会删除其内容,就像ios::trunc一样。如果你想打开一个非空文件进行写入,而不是删除其内容,并保持有效移动流位置的能力,就像seekp一样,这给你留下了很多很好的选择。
我发现解决问题的唯一方法是使用我在this Stack Overflow帖子中找到的解决方案,即打开带有标志的文件(ios::in| ios::ate),即使我正在打开一个ofstream来写,这让我有点不舒服,但这是我现在正在做的。
k75qkfdt6#
ios::ate
选项用于输入和输出操作,ios::app
允许我们将数据添加到文件末尾。