20

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

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

ios:ate将 get/put 指针位置设置为文件末尾,因此读/写将从 end 开始,但它与ios::app再次以追加模式打开文件有何不同?

当我创建了 aofstream并在 `ios:app 模式下打开它时,put 流指针仍然指向开头,那么追加是如何工作的?

另外,我知道ifstreamofstreamfstream是管理底层流缓冲区的高级类。

这是否意味着即使在ios:app模式下我也可以从文件中读取数据?

4

3 回答 3

37

app来自 'append' - 所有输出都将被添加(附加)到文件的末尾。换句话说,您不能在文件中的任何其他位置写入,只能在末尾写入。

ate来自 'at end' - 当您打开文件时,它将流位置设置在文件的末尾,但您可以随意移动(搜索)并在任何您喜欢的地方写入。

于 2012-10-17T07:41:56.373 回答
14

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

app防止截断现有文件,并使每次写入都转到文件末尾。原子,如果可能的话;如果其他进程正在写入同一个文件,您的写入仍应结束。但是请注意,这是指实际的系统级写入。但是,如果您正在编写小于缓冲区大小的行,并且您用 终止每一行std::endl,那么您可以依靠原子附加的每一行,而不管其他进程可能对该文件执行什么操作。为了有效,您可能还想使用pubsetbufon 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).

于 2012-10-17T08:34:26.403 回答
10

如果你看一下这个参考,你会看到:

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都将始终写入末尾。

于 2012-10-17T07:41:08.630 回答