ios_base::ATE 和 ios_base::TRUNC 有什么区别?

what's the difference between ios_base::ate and ios_base::trunc?

本文关键字:base ios 区别 什么 ATE TRUNC      更新时间:2023-10-16

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

为了使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::out,这是std::ofstream)的默认值,则无论如何都会删除所有现有内容。std::ios::trunc添加任何有用内容的唯一时间是您同时指定inout的内容,在这种情况下,如果您不指定std::ios::trunc,将保留现有内容

如果

文件为空或新,您的示例没有太大区别,但如果文件已包含字符,则使用 std::ios_base::ate 打开并写入文件将附加字符,而使用 std::ios_base::trunc 打开后写入将覆盖这些字符。