这两种文件打开模式有什么区别?
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,则可以指望每个行以原子方式附加,而不管其他进程可能对该文件执行了什么操作.为了有效,您可能也希望使用pubsetbuf它filebuf,以确保最小的缓冲区大小.
在实践中,我认为我从未使用过任何一种,或者发现它们有任何用处.app特别是缓冲问题通常使我编写自己的streambuf概念无限缓冲(std::vector<char>作为缓冲区),它打开底层系统文件,相当于app,但保证只在明确刷新时写入它(如同`的std :: ENDL).
如果您查看此参考,您将看到:
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您都将始终在最后写入.
| 归档时间: |
|
| 查看次数: |
32720 次 |
| 最近记录: |