This问题询问appate之间的区别,答案和cppreference都暗示唯一的区别是app意味着将写游标放在每次写操作之前的文件末尾,而ate意味着将写游标放在了文件末尾仅在打开文件时在文件末尾。

我实际上看到的是(在VS 2012中),指定ate会丢弃现有文件的内容,而app不会(将新内容附加到先前存在的内容中)。换句话说,ate似乎暗含trunc

以下语句将“Hello”附加到现有文件:

ofstream("trace.log", ios_base::out|ios_base::app) << "Hello\n";

但是以下语句仅用“Hello”替换文件的内容:
ofstream("trace.log", ios_base::out|ios_base::ate) << "Hello\n";

VS 6.0的MSDN文档暗示不应该发生这种情况(但是这句话似乎已在更高版本的Visual Studio中撤回):

最佳答案

您需要将std::ios::instd::ios::ate结合在一起,然后查找文件的结尾并附加文本:

考虑我有一个包含以下内容的文件“data.txt”:

"Hello there how are you today? Ok fine thanx. you?"

现在我打开它:

1:std::ios::app:
std::ofstream out("data.txt", std::ios::app);

out.seekp(10); // I want to move the write pointer to position 10

out << "This line will be appended to the end of the file";

out.close();

结果不是我想要的:不移动写指针,而仅将文本附加到末尾。

2:std::ios::ate:
std::ofstream out2("data.txt", std::ios::ate);

out2 << "This line will be ate to the end of the file";

out2.close();

上面的结果不是我希望不附加任何文本,而是内容被截断了!

为了解决这个问题,请结合atein:
std::ofstream out2("data.txt", std::ios::ate | std::ios::in);

out2 << "This line will be ate to the end of the file";

out2.close();

现在将文本追加到末尾,但是有什么区别:

如我所说,应用程序不允许移动写指针,但吃了却允许。
std::ofstream out2("data.txt", std::ios::ate | std::ios::in);

out2.seekp(5, std::ios::end); // add the content after the end with 5 positions.

out2 << "This line will be ate to the end of the file";

out2.close();

在上方,我们可以将写入指针移动到我们想要的位置,而使用应用程序则无法。
  • 看这个例子:https://www.youtube.com/watch?v=6cDcTp1gn4Q
  • 08-26 12:39