以下是来自MSDN的文件: 吃,在首次创建控制对象时寻找流的末尾。
trunc ,在创建控制对象时删除现有文件的内容。
我只是无法理解它们之间的差异,以下两个代码片段的行为相同(它们在插入之前清除了内容),有谁能帮我找出差异?
代码段1:
ofstream ofs(L"F:\\iMoney.txt", ios_base::trunc);
ofs << L"Hello, money~" << endl;
ofs.close();
代码段2:
ofstream ofs(L"F:\\iMoney.txt", ios_base::ate);
ofs << L"Hello, money~" << endl;
ofs.close();
答案 0 :(得分:2)
要使std::ate
真正有意义,您需要为阅读和写作打开fstream
:
std::fstream file("iMoney.txt", std::ios::in | std::ios::out | std::ios::ate);
这将保留现有内容,写入位置将从文件末尾开始,因此您编写的内容将附加到现有内容,除非您使用seekp
将写入位置移动到其他位置。
相比之下,如果您指定std::ios::trunc
,则会从文件中删除所有现有内容(无论指定std::ios::in
,std::ios::out
还是两者都指定)。但是,如果您只指定std::ios::out
(std::ofstream
的默认值),则无论如何都会删除所有现有内容。 std::ios::trunc
添加任何有用内容的唯一时间是您同时指定in
和out
的内容,在这种情况下,如果您没有,则会保留现有内容 指定std::ios::trunc
。
答案 1 :(得分:0)
如果文件为空或新的,您的示例没有太大区别,但如果文件已包含字符,则以std::ios_base::ate
打开并写入文件追加使用std::ios_base::trunc
打开后写字时的em>字符会覆盖这些字符。