以下是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
复制相似问题