C++ Filehandling:Difference between ios:app and ios:ate?
这两种文件打开模式有什么区别?
ios:ate
将 get / put 指针位置设置为文件的末尾,因此读取 / 写入将从末尾开始,但它与ios::app
有何不同,后者再次在追加模式下打开文件?
当我创建了一个ofstream
并在 'ios:app 模式下打开它时,put 流指针仍然指向开头,那么追加是如何工作的?
此外,我了解ifstream
,ofstream
和fstream
是用于管理底层流缓冲区的高级类。
这是否意味着即使在ios:app
模式下,我也可以从文件中读取数据?
app
来自 'append'-所有输出将被添加(追加)到文件的末尾。换句话说,你不能在文件的其他地方写,但在最后。
ate
来自 'at end'-它在打开文件时将流位置设置在文件的末尾,但是您可以自由地移动它(查找)并在您喜欢的任何地方写入。
ate
只是在打开后将您定位在文件的末尾,而没有别的。在ofstream
上没有太多用处,至少没有其他标志,因为文件无论如何都会被截断,所以开始是结束。(为了避免截断,并且仍然能够在文件中的任何位置写入,您需要或在ios::in
中,即使您不打算读取。)
app
防止截断现有文件,并导致每次写入都转到文件的末尾。原子地,如果可能的话;如果其他进程正在写入同一文件,则您的写入仍应结束。但是请注意,这可能是指实际的系统级别写入。但是,如果您正在写入小于缓冲区大小的行,并且您可以在std::endl
上终止每行。
在实践中,我不认为我曾经使用过它们中的任何一个,或者发现它们有任何用处。特别是app
的缓冲问题,通常导致我编写自己的streambuf
,在概念上具有无限的缓冲(std::vector<char>
作为缓冲区),它以app
的等效形式打开底层系统文件。
如果您查看例如this reference,您将看到:
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
,无论您为写入指针设置什么位置,您都将始终在末尾写入。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(25条)