ios::app與ios::ate的區別


 

 

文件流

ios::app

ios::ate

打開方式

結果

打開方式

結果

ofstream

(默認是ios::in | ios::trunc)

ios::app或ios::app|ios::out

如果沒有文件,生成空文件;

如果有文件,在文件尾追加

ios::ate或ios::ate|ios::out

如果沒有文件,生成空文件;

如果有文件,清空該文件

ios::app|ios::in

不管有沒有文件,都是失敗

ios::ate|ios::in

如果沒有文件,打開失敗;

如果有文件,定位到文件尾,可以寫文件,但是不能讀文件

Ifstream

(默認是ios::in)

ios::app或ios::app|ios::out

不管有沒有文件,都是失敗

ios::ate或ios::ate|ios::out

如果沒有文件,打開失敗;
如果有文件,定位到文件尾,但是不能寫文件

ios::app|ios::in

?

ios::ate|ios::in

?

fstream

(默認是ios::in | ios::out)

ios::app|ios::out

如果沒有文件,創建文件;

如果有文件,在文件尾追加

ios::ate|ios::out

如果沒有文件,創建文件;

如果有,清空文件

ios::app|ios::in

如果沒有文件,失敗

ios::ate|ios::in

如果沒有文件,失敗

N/A

N/A

ios::ate|ios::out|ios::in

如果沒有文件,打開失敗,

如果有文件,定位到文件尾

總結

ios::app不能和ios::in相配合,

但可以和ios::out配合,打開輸入流

ios::ate可以和ios::in配合,此時定位到文件尾;

如果沒有ios::in相配合而只是同ios::out配合,那么將清空原文件;

區別

app會在每次寫操作之前都把寫指針置於文件末尾,

而ate模式則只在打開時才將寫指針置於文件末尾。在文件操作過程中,可以通過seekp等操作移動指針位置。

例子:

多個線程或者進程對一個文件寫的時候,假如文件原來的內容是abc

 

以ios::app:

第一個線程(進程)往里面寫了個d,第二個線程(進程)寫了個e的話,結果是abcde

以ios:ate:

后面寫的會覆蓋前面一個寫的,第一個線程(進程)往里面寫了個d,第二個線程(進程)寫了個e的話,結果為abce

 

參考:

CSDN:ios::app與ios::ate打開方式有什么不同

ofstream與ate的故事


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM