ファイル追加モード
OS(および該当する場合はネットワークファイルシステム)が追加モードをサポートしている場合、追加モードを設定すると、複数のライターが存在する場合に、書き込まれたデータがファイル内の既存のデータを上書きしないことが保証されます。これは、異なるプロセスからのシークと書き込みの間の競合のため、追加モードなしでは実行できないことです。これは、ログファイルの重要な保証です。
追加モードでは、定義上、ファイルの最後にのみ書き込むことができます。
Iostreamオープンモード
[ofstream.cons]によると、をofstream (s, mode)
呼び出しますrdbuf()->open(s, mode|ios_base::out)
。
[filebuf.members]の表「ファイルオープンモード」によると、の動作はオープンモードの観点からfilebuf::open
定義されfopen
ています。
out
「w」を意味します
app
とapp|out
は「a」を意味します
in|out
「r+」を意味します
in|out|trunc
「w+」を意味します
によるとfopen man
、モードは次のことを意味します。
- r+ 読み取りと書き込み用に開きます。
- w ファイルを長さゼロに切り捨てるか、書き込み用のテキストファイルを作成します。
- w+ 読み取りと書き込み用に開きます。ファイルが存在しない場合は作成され、存在しない場合は切り捨てられます。
- 追加用に 開く(ファイルの終わりに書き込む)。ファイルが存在しない場合は作成されます。
最後に、ate
を意味しfseek(file,0,SEEK_END)
ます。
したがって、既存のデータを破棄せずに任意の位置で書き込み用に開く場合は、またはが必要fopen(s,"r+")
ですofstream (s, ios::in|ios::out)
。
IOW、C / C ++では、ファイルを上書きせずに書き込み用に開くには、ファイルへの読み取りアクセス権も必要です。
POSIXの世界
代わりに、 POSIXオープンフラグに直接アクセスするために、 POSIXopen
関数を使用することをお勧めします。、、、、、 ...フラグとは異なり、これらははるかに強力であるだけでなく、独立した直交フラグであり、正常に動作します。O_READ
O_WRITE
O_CREAT
O_EXCL
O_TRUNC
filebuf::open
もちろん、この関数は標準のC++の一部ではありません。通常のプログラミングに関連するすべてのシステム(特別な特性を持つニッチ市場ではない)がサポートしていると思いますopen
。