ios_base::ATE 和 ios_base::TRUNC 有什么区别?
what's the difference between ios_base::ate and ios_base::trunc?
以下是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::in
、 std::ios::out
或两者)。但是,如果您只指定std::ios::out
,这是std::ofstream
)的默认值,则无论如何都会删除所有现有内容。std::ios::trunc
添加任何有用内容的唯一时间是您同时指定in
和out
的内容,在这种情况下,如果您不指定std::ios::trunc
,将保留现有内容。
如果
文件为空或新,您的示例没有太大区别,但如果文件已包含字符,则使用 std::ios_base::ate
打开并写入文件将附加字符,而使用 std::ios_base::trunc
打开后写入将覆盖这些字符。
相关文章:
- 使用ios:ate写入到流会覆盖现有文件
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 构造函数采用 Base&不被调用
- 如何访问RTCVideoRenderer的帧?(ios)
- ios::fmtflags 在 C++ 中是如何工作的?setf() 是如何工作的?
- 将sharet_ptr<Derived>转换为shared_ptr<Base>
- 将 BASE 派生类存储在同一容器中
- 避免矢量中的对象切片<Base><shared_ptr>
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 'string'文件在带有C++文件的iOS插件上找不到
- 如何从unique_ptr返回unique_ptr的引用<Derived><Base>?
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 如何将unique_ptr<derived>*转换为<base>unique_ptr*?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 使用 C++ iOS::ate 获取错误的文件大小
- iOS::Base:Precision & SetPrecision