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

问题描述 投票:0回答:7

写入文件时,

ios::ate
ios:app
有什么区别。
在我看来,
ios::app
使您能够在文件中四处移动,而使用
ios::ate
它只能在文件末尾读取/写入。这是正确的吗?

c++ file fstream c++-standard-library
7个回答
90
投票

正好相反。当设置

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


47
投票

它们指定如下(在 C++11 的 27.5.3.1.4 中):

app
在每次写之前寻求结束

ate
打开并寻求打开后立即结束

使用

ios::app
文件中的写入位置是“粘性”的——所有写入都在末尾,无论您在哪里寻找。


35
投票

这里有很好的记录.

ios::ate
“将流的位置指示器设置为打开时流的末尾。”

ios::app
“在每次输出操作之前将流的位置指示器设置为流的末尾。”

这意味着不同之处在于

ios::ate
在您打开文件时将您的位置放在文件末尾。
ios::app
而是在每次刷新流时将其放在文件末尾。例如,如果您有两个程序写入同一个日志文件,
ios::ate
将覆盖自您的程序打开文件后由另一个程序添加到文件中的任何内容。
ios:app
将在每次您的程序添加日志条目时跳转到文件末尾。


12
投票

ios::app
-->“我们不能移动指针。它只会在最后。”

ios::ate
-->“我们可以将记录指针移动到任何其他地方。”


3
投票

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

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

还有什么是每个人都正确的是 ios::ate 不会在每次写入之前将光标移动到文件末尾。所以像 seekp 这样的函数将与 ios::ate 一起工作。同样在技术上正确的是,当你打开它时,ios::ate 会将光标移动到文件的末尾,但这是一个技术问题——见下一段。

与大多数文档和论坛答案不一致的是,实际上(如果有人对我在这里的经历有合理的解释,请发表评论)用 ios::ate 打开文件将删除其内容,就像 ios::trunc .如果你想打开一个非空文件进行写入,而不是删除它的内容,并保留有效移动你的流位置的能力,那么你没有太多好的选择,就像 seekp 一样。

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


1
投票

ios::ate
选项用于输入和输出操作和
ios::app
允许我们将数据添加到文件末尾。


1
投票

试试这段代码,它会帮助你理解(先清除旧数据——我个人结合了

ios::in
ios::ate
):

ofstream myFile("test.txt", ios::ate|ios::in);
myFile << "Hello World";
myFile.seekp(6, ios::beg);
myFile << "Hello World";
myFile.close();

ios::app
测试,它有一些差异。

© www.soinside.com 2019 - 2024. All rights reserved.