ios :: app和ios :: ate之间的区别

时间:2012-10-17 07:36:10

标签: c++ iostream

  

可能重复:
  C++ Filehandling: Difference between ios:app and ios:ate?

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

ios:ate将get / put指针位置设置为文件末尾=>读/写会 从头开始,但它与ios :: app有什么不同,它再次以追加模式打开文件...但是当我创建了一个ofstream并在ios:app模式下打开它时,put流指针仍指向一开始,后续的工作如何呢?

我也理解ifstream,ofstream和fstream是管理底层流缓冲区的高级类。那么它是否意味着即使在ios:app模式我也可以从文件中读取数据?

3 个答案:

答案 0 :(得分:28)

app来自'append' - 所有输出都将被添加(追加)到文件的末尾。换句话说,你不能在文件的任何其他地方写,但最后。

ate来自'结束' - 当你打开它时,它会在文件末尾设置流的位置,但是你可以自由地移动它(寻找)并在任何你喜欢的地方写字。 / p>

答案 1 :(得分:12)

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

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

在实践中,我认为我从未使用过它们,或者发现它们没有任何用处。特别是app的缓冲问题通常导致我编写自己的streambuf,概念上无限制的缓冲(std::vector<char>作为缓冲区),它打开底层系统文件相当于app,但保证在显式刷新时只写入它(与`std :: endl一样)。

答案 2 :(得分:8)

如果你看一下,例如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时,无论您为写入指针设置什么位置,都将总是写在最后。< / p>