这两种文件打开方式有什么区别?
ios:ate
将 get/put 指针位置设置为文件末尾,因此读/写将从 end 开始,但它与ios::app
再次以追加模式打开文件有何不同?
当我创建了 aofstream
并在 `ios:app 模式下打开它时,put 流指针仍然指向开头,那么追加是如何工作的?
另外,我知道ifstream
、ofstream
和fstream
是管理底层流缓冲区的高级类。
这是否意味着即使在ios:app
模式下我也可以从文件中读取数据?
这两种文件打开方式有什么区别?
ios:ate
将 get/put 指针位置设置为文件末尾,因此读/写将从 end 开始,但它与ios::app
再次以追加模式打开文件有何不同?
当我创建了 aofstream
并在 `ios:app 模式下打开它时,put 流指针仍然指向开头,那么追加是如何工作的?
另外,我知道ifstream
、ofstream
和fstream
是管理底层流缓冲区的高级类。
这是否意味着即使在ios:app
模式下我也可以从文件中读取数据?
app
来自 'append' - 所有输出都将被添加(附加)到文件的末尾。换句话说,您不能在文件中的任何其他位置写入,只能在末尾写入。
ate
来自 'at end' - 当您打开文件时,它将流位置设置在文件的末尾,但您可以随意移动(搜索)并在任何您喜欢的地方写入。
ate
打开后只需将您定位在文件的末尾,仅此而已。在 an 上用处不大ofstream
,至少没有其他标志,因为文件无论如何都会被截断,所以开头就是结尾。(为了避免截断,并且仍然能够在文件中的任何位置写入ios::in
,即使您不打算阅读,您也需要或 in 。)
app
防止截断现有文件,并使每次写入都转到文件末尾。原子,如果可能的话;如果其他进程正在写入同一个文件,您的写入仍应结束。但是请注意,这是指实际的系统级写入。但是,如果您正在编写小于缓冲区大小的行,并且您用 终止每一行std::endl
,那么您可以依靠原子附加的每一行,而不管其他进程可能对该文件执行什么操作。为了有效,您可能还想使用pubsetbuf
on filebuf
,以确保最小缓冲区大小。
In practice, I don't think I've ever used either of them, or found them of any use. The buffering issues with app
, in particular, have generally led me to write my own streambuf
, with conceptually unlimited buffering (an std::vector<char>
as buffer), which opens the underlying system file with the equivalent of app
, but guarantees only writing to it when explicitly flushed (as with `std::endl).
如果你看一下这个参考,你会看到:
app seek to the end of stream before each write
和
ate seek to the end of stream immediately after open
这意味着ios::app
只在最后写入,但ios::ate
默认情况下在最后读取和写入。但是,withios::ate
可以在文件中自由查找,但无论您为写入指针设置的位置如何,ios::app
都将始终写入末尾。