20

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

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

ios:ateios::appは get/put ポインターの位置をファイルの末尾に設定して、読み取り/書き込みが末尾から開始されるようにしますが、ファイルを再び追加モードで開く とどう違うのでしょうか?

を作成してofstreamios:app モードで開いた場合、プット ストリーム ポインタはまだ先頭を指していますが、追加はどのように機能しますか?

ifstreamまた、 、ofstream、およびfstreamは、基になるストリーム バッファーを管理するための高レベル クラスであることも理解しています。

モードでもios:appファイルからデータを読み取ることができるということですか?

4

3 に答える 3

37

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

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

于 2012-10-17T07:41:56.373 に答える
14

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

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

実際には、私はそれらのいずれも使用したことがないと思いますし、役に立たなかったと思います。特にのバッファリングの問題により、一般に、概念的に無制限のバッファリング ( as バッファ) を使用しappて独自の を作成するようになりました。 `std::endl)。streambufstd::vector<char>app

于 2012-10-17T08:34:26.403 に答える
10

たとえば、この参照を見ると、次のことがわかります。

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

于 2012-10-17T07:41:08.630 に答える