首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ios_base::ate和ios_base::trunc有什么区别?

ios_base::ate和ios_base::trunc有什么区别?
EN

Stack Overflow用户
提问于 2014-11-13 02:40:36
回答 2查看 561关注 0票数 1

以下是MSDN:ate的文档,用于在首次创建流的控制对象时寻求流的末尾。

trunc,用于在创建控制对象时删除现有文件的内容。

我只是无法理解它们之间的区别,下面两个代码段的行为是相同的(它们在执行插入之前清除内容),任何人都可以帮助我找出它们之间的区别吗?

代码片段1:

代码语言:javascript
运行
复制
ofstream ofs(L"F:\\iMoney.txt", ios_base::trunc);
ofs << L"Hello, money~" << endl;
ofs.close();

代码片段2:

代码语言:javascript
运行
复制
ofstream ofs(L"F:\\iMoney.txt", ios_base::ate);
ofs << L"Hello, money~" << endl;
ofs.close();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-13 02:55:05

要使std::ate具有真正的意义,您需要打开一个fstream,用于读写:

代码语言:javascript
运行
复制
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,则现有内容将被保留。

票数 2
EN

Stack Overflow用户

发布于 2014-11-13 02:55:47

如果文件是空的或新的,那么您的示例并没有太大的区别,但是如果文件中已经包含了字符,那么用std::ios_base::ate打开并写入文件将追加字符,而在用std::ios_base::trunc打开后写入将覆盖这些字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26900439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档