This问题询问app
和ate
之间的区别,答案和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::in
与std::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();
上面的结果不是我希望不附加任何文本,而是内容被截断了!
为了解决这个问题,请结合
ate
和in
: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();
在上方,我们可以将写入指针移动到我们想要的位置,而使用应用程序则无法。