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

Aru*_*run 20 c++ iostream

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

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

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

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

toz*_*zka 32

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

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


Jam*_*nze 13

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

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

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


Som*_*ude 8

如果您查看此参考,您将看到:

app     seek to the end of stream before each write 
Run Code Online (Sandbox Code Playgroud)

ate     seek to the end of stream immediately after open 
Run Code Online (Sandbox Code Playgroud)

这意味着ios::app只在最后写入,但ios::ate默认情况下在末尾读取和写入.但是,ios::ate您可以在文件中自由搜索,但无论您为写入指针设置什么位置,ios::app您都将始终在最后写入.