これら2つのファイルを開くモードの違いは何ですか?
ios:ateは、get/putポインターの位置をファイルの最後に設定します=>読み取り/書き込みは最後から開始されますが、ios :: appとはどのように異なります。私はofstreamを作成し、それをios:appモードで開きましたが、書き込みストリームポインターはまだ先頭を指していますが、追加はどのように機能しますか?
また、ifstream、ofstream、fstreamは、基になるストリームバッファーを管理するための高レベルのクラスであることも理解しています。では、ios:appモードでもファイルからデータを読み取ることができるということですか?
app
は 'append'から取得されます-すべての出力はファイルの最後に追加(追加)されます。つまり、ファイルの最後以外のどこにも書き込むことはできません。
ate
は 'at end'から取得されます-ファイルを開いたときにストリームの位置をファイルの最後に設定しますが、好きな場所に自由に移動(シーク)して書き込むことができます。
ate
は、ファイルを開いた後、ファイルの最後に配置するだけで、それ以外のものはありません。 ofstream
では、少なくとも他のフラグがない場合はあまり使用されません。ファイルはとにかく切り捨てられるため、最初が最後です。 (切り捨てを回避し、ファイル内の任意の場所に書き込むことができるようにするには、読み取る予定がなくても、ios::in
内に書き込む必要があります。)
app
は、既存のファイルの切り捨てを防止し、すべての書き込みをファイルの最後に移動させます。原子的に、可能であれば;他のプロセスが同じファイルに書き込んでいる場合でも、書き込みは最後まで行われるはずです。ただし、これは実際のシステムレベルの書き込みを指すことに注意してください。ただし、バッファーサイズよりも小さい行を書き込んでいて、各行をstd::endl
で終了する場合、他のプロセスがファイルを使用しているかどうかに関係なく、アトミックに追加される各行を数えることができます。効果的にするには、pubsetbuf
でもfilebuf
を使用して、最小バッファーサイズを確保することをお勧めします。
実際には、私はそれらのいずれかを使用したことはないと思います。特に、app
のバッファリングの問題により、一般的に、概念的に無制限のバッファリング(std::vector<char>
をバッファとして)を使用して独自のstreambuf
を記述し、app
と同等の基礎となるシステムファイルを開きますが、明示的にフラッシュされたとき( `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
デフォルトでは、最後に読み取りと書き込みを行います。ただし、ios::ate
ファイル内を自由に検索できますが、ios::app
書き込みポインタに設定した位置に関係なく、最後に常に書き込みます。