写入文件时,
ios::ate
和 ios:app
有什么区别。ios::app
使您能够在文件中四处移动,而使用 ios::ate
它只能在文件末尾读取/写入。这是正确的吗?
正好相反。当设置
ios::ate
时,初始位置将是文件的末尾,但之后您可以自由寻找。当设置ios::app
时,all输出操作在文件末尾执行。由于所有写入都隐含地先于查找,因此无法在其他地方写入。
它们指定如下(在 C++11 的 27.5.3.1.4 中):
在每次写之前寻求结束app
打开并寻求打开后立即结束ate
使用
ios::app
文件中的写入位置是“粘性”的——所有写入都在末尾,无论您在哪里寻找。
ios::app
-->“我们不能移动指针。它只会在最后。”
ios::ate
-->“我们可以将记录指针移动到任何其他地方。”
我在这里添加一个答案,因为我最近遇到了 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),即使我正在打开用于写作的流。这让我有点不舒服,但这就是我现在正在做的。
ios::ate
选项用于输入和输出操作和
ios::app
允许我们将数据添加到文件末尾。
试试这段代码,它会帮助你理解(先清除旧数据——我个人结合了
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
测试,它有一些差异。