以下是MSDN:ate的文档,用于在首次创建流的控制对象时寻求流的末尾。
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();
发布于 2014-11-13 02:55:05
要使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
,则现有内容将被保留。
发布于 2014-11-13 02:55:47
如果文件是空的或新的,那么您的示例并没有太大的区别,但是如果文件中已经包含了字符,那么用std::ios_base::ate
打开并写入文件将追加字符,而在用std::ios_base::trunc
打开后写入将覆盖这些字符。
https://stackoverflow.com/questions/26900439
复制相似问题