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

ios::app和ios:ate有什么区别?
EN

Stack Overflow用户
提问于 2012-10-17 07:36:09
回答 3查看 43.2K关注 0票数 21

可能重复: C++文件处理: ios:app和ios:ate之间的区别?

这两种文件打开模式有什么区别?

ios:ate将get/put指针位置设置为文件的末尾,因此读取/写入将从结束开始,但它与ios::app有何不同,后者在追加模式下再次打开文件?

当我创建了一个ofstream并以‘`ios:app模式打开它时,put流指针仍然指向开头,那么追加的工作是如何工作的呢?

此外,我理解ifstreamofstreamfstream是管理底层流缓冲区的高级类。

这是否意味着即使在ios:app模式下,我也可以从文件中读取数据?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-17 07:41:56

app来自'append‘-所有输出都将添加(附加)到文件的末尾。换句话说,您不能在文件中的任何地方写入,但必须在文件的末尾。

ate来自于'at end‘--当您打开它时,它会在文件的末尾设置流位置,但是您可以自由地移动它(查找),并随心所欲地写它。

票数 40
EN

Stack Overflow用户

发布于 2012-10-17 08:34:26

ate只是在打开文件后将您定位在文件的末尾,而没有其他任何位置。它在ofstream上没有多大用处,至少没有其他标志,因为文件无论如何都会被截断,所以开始就是结束。(为了避免截断,并且仍然能够在文件中的任何地方写入,您也需要或使用ios::in,即使您不打算阅读。)

app防止截断现有文件,并导致每次写入到文件的末尾。如果可能的话,如果可能的话,如果其他进程正在写入同一个文件,那么您的写入仍然应该结束。但是请注意,这指的是实际的系统级别写。但是,如果您正在编写小于缓冲区大小的行,并且使用std::endl终止每一行,则可以指望每一行被原子地追加,而不管其他进程如何处理该文件。为了有效,您可能也希望在pubsetbuf上使用filebuf,以确保最小的缓冲区大小。

在实践中,我认为我从未使用过其中任何一种,也没有发现它们有任何用处。尤其是app的缓冲问题通常会导致我编写自己的streambuf,在概念上不受限制地缓冲( std::vector<char>作为缓冲区),它以相当于app的形式打开底层系统文件,但保证只在显式刷新时(如‘`std::endl)向其写入。

票数 14
EN

Stack Overflow用户

发布于 2012-10-17 07:41:08

如果您查看例如本参考,您将看到:

代码语言:javascript
运行
复制
app     seek to the end of stream before each write 

代码语言:javascript
运行
复制
ate     seek to the end of stream immediately after open 

这意味着ios::app只在末尾写入,而默认情况下ios::ate在末尾进行读写。但是,使用ios::ate,您可以在文件中自由地查找,但是使用ios::app,无论您为写入指针设置了什么位置,始终会在末尾写入。

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

https://stackoverflow.com/questions/12929378

复制
相关文章

相似问题

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