文件流 |
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 |
參考: