2012-10-17 8 views
12

可能な重複食べた:
C++ Filehandling: Difference between ios:app and ios:ate?差は::アプリとiOSは::

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

ios:ateは、ファイルの最後にポインタの位置を設定します。> read/write beginから終わりですが、ios :: appとはどのように違うのですか? ... ofstreamを作成してios:appモードで開いたとき、putストリームポインタがまだ開始点を指していますが、どのように追加作業が行われますか?

また、ifstream、ofstreamおよびfstreamは、基礎となるストリームバッファを管理するための高水準クラスであることを理解しています。つまり、ios:アプリモードでもファイルからデータを読み取ることができるということですか?

+1

基本的には、 'app'は何かを書く前に常に終わりを探しますが、' ate'は開いた後にシークしてそこに保持します。 [この質問](http://stackoverflow.com/questions/10359702/c-filehandling-difference-between-iosapp-and-iosate)を参照してください。 – chris

答えて

23

appは 'append'からのもので、すべての出力がファイルの最後に追加されます(追加されます)。言い換えれば、ファイル内の他の場所に書き込むことはできませんが、最後には

ateとなります。ファイルの最後にストリームの位置を設定しますが、自由に移動することができますあなたが喜んでどこにでも書くことができます。

+0

'ate'が切り捨てを防ぐことができないという事実は、かなり役に立たなくなってしまいます。 'app'が指定されていない時に部分的なレコードを最後に付加するかもしれないという事実(バッファリングのため)はそれをかなり役に立たなくします。 –

+0

@James:この点で 'app' /' ate'は、これらのフラグで開かれていないファイルの末尾まで、どのように異なっていますか?私はそれが、ただ一つのシークを救うための便宜として意図されたと思った。誰もがストリームをフラッシュしたり、ファイルの完全性を確保することを誰も期待していませんでした。 –

+0

@SteveJessop 'app'は' fopen'の '' a''にマップします。すべてのシステムがそれをサポートするわけではないので、C標準はアトミック性を必要としませんが、ファイルのオープン時には、実装が 'O_APPEND'フラグを使用していました。各書き込みの前に原子のシークを終了させる原因になります。この違いは、他のプロセスがファイルに書き込んでいる場合に表示されます。別のプロセスがファイルに書き込むとき、ファイル内のあなたの位置は前進せず、次の書き込みは書き込まれたものを上書きします。 'app'では、あなたの次の書き込みは関係なく(そしてレースはありません)追加されます。 –

8

this reference、あなたが表示されます。

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

10

ateは、開封後にファイルの最後に移動します。 ofstreamでは、他のフラグを付けなくてもあまり役に立ちません。なぜなら、ファイルはとにかく切り詰められているからです。開始は最後です。 (切り捨てを避け、ファイル内のどこにでも書き込むことができるようにするには、読まなくてもios::inにする必要があります)。

appは既存のファイルの切り捨てを防ぎ、すべての書き込みがファイルの最後に移動します。可能であれば原子的に;他のプロセスが同じファイルに書き込みを行っている場合は、書き込みは終了します。ただし、実際のシステムレベルの書き込みを参照してください。ただし、バッファサイズよりも小さい行を書き込んでいて、各行をstd::endlで終了すると、そのファイルで何が行われているかにかかわらず、アトミックに追加される各行をカウントできます。効果的にするには、最小バッファサイズを確保するために、filebufpubsetbufを使用することをお勧めします。

実際には、私はこれまでにどちらかを使用したとは思っていません。特に、appのバッファリングの問題は、概念的に無制限のバッファリング(std::vector<char>をバッファとして)を使用して、appに相当するシステムファイルを開きますが、明示的に書き込むことのみを保証して、自分自身のstreambufを書きましたflushed( `std :: endlと同様に)。

関連する問題