2013-04-28 3 views
5

この質問はHow to protect log from application crash?が私を別の人に導いてくれました - 何がstd::ofstream::close()実際にしますか?私はそれがflush()を呼び出すことを知っており、それは一つのことです。しかし、他に何がありますか?ファイルを実際に閉じるのは何ですか?std :: ofstream :: close()は実際に何をしますか?

編集:私は私の質問を言い換えるてみましょう - は何が物理的にclose()に通話中に実際のファイルに行われているか、それだけでstd::ofstream内部クリーンアップのものでしょうか?

答えて

3

、すなわちflush()close(2)は、基礎となるファイル記述子で呼び出されます。それはオペレーティングシステムによって何が起こるかによって異なりますが、ファイルによって占められている実際のストレージには何も起こりません。

になります(ファイルディスクリプタがそのファイルの最後の参照であった場合)ファイルに関連付けられたファイルエントリがプロセスのオープンファイルテーブルから削除されます。私。プロセス関連のカーネルメモリを解放します。ここで

1

現在オブジェクトに関連付けられているファイルを閉じ、ストリームから関連付けを解除します。

保留中の出力シーケンスがファイルに書き込まれます。

ストリームが現在いずれのファイルにも関連付けられていない(つまり、ファイルが正常に開かれていない)場合、この関数の呼び出しは失敗します。

ストリームのファイル関連付けは、内部ストリームバッファによって保持されます。 内部的に、この関数はrdbuf() - > close()を呼び出し、失敗した場合にフェイルビットを設定します。

ofstreamオブジェクトが破棄されると、開いているファイルはすべて自動的に閉じられます。

:ユーザ空間バッファをフラッシュする以外http://www.cplusplus.com/reference/fstream/ofstream/close/

+0

私の質問を言い換えて、元の投稿の編集をご覧ください。 – NPS

3

は、ドキュメントからの呼び出しのトレースです:


void std::basic_ofstream::close(); 

が効果的rdbuf()->close()を呼び出します。動作中にエラーが発生すると、setstate(failbit)が呼び出されます。


std::basic_streambuf<CharT,Traits>* std::basic_ofstream::rdbuf() const; 

関連したストリームバッファを返します。ストリームバッファが関連付けられていない場合は、NULLを返します。


std::basic_streambuf実際ので、std::basic_filebuf継承:


std::basic_filebuf<CharT, Traits>* std::basic_filebuf::close(); 

プット領域が存在する場合(例えば、ファイルが書き込みのために開かれた)、最初の呼び出しoverflow(Traits::eof())は、ファイルに保留中のすべての出力を書き込むために、任意の不変配列を含む。

最近呼び出された関数の場合、underflow()のうち、overflow()seekpos()、およびseekoff()overflow()た後、染められロケールに従ってアンシフト配列を決定するために、おそらく複数回、std::codecvt::unshift()を呼び出し、ファイルにそのシーケンスを書き込みoverflow(Traits::eof())となります。

次に、先行する呼び出しが成功したか失敗したかにかかわらず、std::fcloseを呼び出すことによってファイルを閉じます。

注:close()は、一般的に順番に、一般的にstd::basic_fstreamのデストラクタによって呼び出され、std::basic_filebuf(のデストラクタを介して呼び出されるすべての


まず、我々はそれはdoesnのことを見ることができます実際にはflush()と直接呼び出してください。フラッシングの効果は実際にはstd::basic_filebuf::close()の方法で発生しますが、それでもまだファイルの改ざんを行っていることがわかります。その後、ファイルは単にクローズされます。

上記の注:注:ほとんどの場合、std::basic_ofstream::close()を明示的に呼び出す必要はありません。

関連する問題