ios_base :: ate和ios_base :: trunc之间的区别是什么?

时间:2014-11-13 02:40:36

标签: c++ windows

以下是来自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();

2 个答案:

答案 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::instd::ios::out还是两者都指定)。但是,如果您只指定std::ios::outstd::ofstream的默认值),则无论如何都会删除所有现有内容。 std::ios::trunc添加任何有用内容的唯一时间是您同时指定inout的内容,在这种情况下,如果您没有,则会保留现有内容 指定std::ios::trunc

答案 1 :(得分:0)

如果文件为空或新的,您的示例没有太大区别,但如果文件已包含字符,则以std::ios_base::ate打开并写入文件追加std::ios_base::trunc打开后写字时的em>字符会覆盖这些字符。