可能重复:
C++ Filehandling: Difference between ios:app and ios:ate?
这两种文件打开模式有什么区别?
ios:ate将get / put指针位置设置为文件末尾=>读/写会 从头开始,但它与ios :: app有什么不同,它再次以追加模式打开文件...但是当我创建了一个ofstream并在ios:app模式下打开它时,put流指针仍指向一开始,后续的工作如何呢?
我也理解ifstream,ofstream和fstream是管理底层流缓冲区的高级类。那么它是否意味着即使在ios:app模式我也可以从文件中读取数据?
答案 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>