这两种文件打开模式有什么区别?
ios:ate
将get/put指针位置设置为文件的末尾,因此读取/写入将从结束开始,但它与ios::app
有何不同,后者在追加模式下再次打开文件?
当我创建了一个ofstream
并以‘`ios:app模式打开它时,put流指针仍然指向开头,那么追加的工作是如何工作的呢?
此外,我理解ifstream
、ofstream
和fstream
是管理底层流缓冲区的高级类。
这是否意味着即使在ios:app
模式下,我也可以从文件中读取数据?
发布于 2012-10-17 07:41:56
app
来自'append‘-所有输出都将添加(附加)到文件的末尾。换句话说,您不能在文件中的任何地方写入,但必须在文件的末尾。
ate
来自于'at end‘--当您打开它时,它会在文件的末尾设置流位置,但是您可以自由地移动它(查找),并随心所欲地写它。
发布于 2012-10-17 08:34:26
ate
只是在打开文件后将您定位在文件的末尾,而没有其他任何位置。它在ofstream
上没有多大用处,至少没有其他标志,因为文件无论如何都会被截断,所以开始就是结束。(为了避免截断,并且仍然能够在文件中的任何地方写入,您也需要或使用ios::in
,即使您不打算阅读。)
app
防止截断现有文件,并导致每次写入到文件的末尾。如果可能的话,如果可能的话,如果其他进程正在写入同一个文件,那么您的写入仍然应该结束。但是请注意,这指的是实际的系统级别写。但是,如果您正在编写小于缓冲区大小的行,并且使用std::endl
终止每一行,则可以指望每一行被原子地追加,而不管其他进程如何处理该文件。为了有效,您可能也希望在pubsetbuf
上使用filebuf
,以确保最小的缓冲区大小。
在实践中,我认为我从未使用过其中任何一种,也没有发现它们有任何用处。尤其是app
的缓冲问题通常会导致我编写自己的streambuf
,在概念上不受限制地缓冲( std::vector<char>
作为缓冲区),它以相当于app
的形式打开底层系统文件,但保证只在显式刷新时(如‘`std::endl)向其写入。
发布于 2012-10-17 07:41:08
如果您查看例如本参考,您将看到:
app seek to the end of stream before each write
和
ate seek to the end of stream immediately after open
这意味着ios::app
只在末尾写入,而默认情况下ios::ate
在末尾进行读写。但是,使用ios::ate
,您可以在文件中自由地查找,但是使用ios::app
,无论您为写入指针设置了什么位置,始终会在末尾写入。
https://stackoverflow.com/questions/12929378
复制相似问题