web-dev-qa-db-ja.com

ios :: appとios :: ateの違い

重複の可能性:
C++ファイル処理:ios:appとios:ateの違い?

これら2つのファイルを開くモードの違いは何ですか?

ios:ateは、get/putポインターの位置をファイルの最後に設定します=>読み取り/書き込みは最後から開始されますが、ios :: appとはどのように異なります。私はofstreamを作成し、それをios:appモードで開きましたが、書き込みストリームポインターはまだ先頭を指していますが、追加はどのように機能しますか?

また、ifstream、ofstream、fstreamは、基になるストリームバッファーを管理するための高レベルのクラスであることも理解しています。では、ios:appモードでもファイルからデータを読み取ることができるということですか?

20
Arun

appは 'append'から取得されます-すべての出力はファイルの最後に追加(追加)されます。つまり、ファイルの最後以外のどこにも書き込むことはできません。

ateは 'at end'から取得されます-ファイルを開いたときにストリームの位置をファイルの最後に設定しますが、好きな場所に自由に移動(シーク)して書き込むことができます。

30
tozka

ateは、ファイルを開いた後、ファイルの最後に配置するだけで、それ以外のものはありません。 ofstreamでは、少なくとも他のフラグがない場合はあまり使用されません。ファイルはとにかく切り捨てられるため、最初が最後です。 (切り捨てを回避し、ファイル内の任意の場所に書き込むことができるようにするには、読み取る予定がなくても、ios::in内に書き込む必要があります。)

appは、既存のファイルの切り捨てを防止し、すべての書き込みをファイルの最後に移動させます。原子的に、可能であれば;他のプロセスが同じファイルに書き込んでいる場合でも、書き込みは最後まで行われるはずです。ただし、これは実際のシステムレベルの書き込みを指すことに注意してください。ただし、バッファーサイズよりも小さい行を書き込んでいて、各行をstd::endlで終了する場合、他のプロセスがファイルを使用しているかどうかに関係なく、アトミックに追加される各行を数えることができます。効果的にするには、pubsetbufでもfilebufを使用して、最小バッファーサイズを確保することをお勧めします。

実際には、私はそれらのいずれかを使用したことはないと思います。特に、appのバッファリングの問題により、一般的に、概念的に無制限のバッファリング(std::vector<char>をバッファとして)を使用して独自のstreambufを記述し、appと同等の基礎となるシステムファイルを開きますが、明示的にフラッシュされたとき( `std :: endlと同様に)。

13
James Kanze

たとえば、 このリファレンス 、次のように表示されます:

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書き込みポインタに設定した位置に関係なく、最後に常に書き込みます。