2016-05-31 6 views
2

C++言語では、ファイルを開く方法と操作方法が複数あります。しかし、RAIIアプローチは非常に普及しています。なぜなら、デストラクタはメモリを解放することに注意しているからです。ファイルストリームを使用するRAII

しかし、ファイルストリームの終了はどうですか?私が知る限り、destruktorはファイルを閉じなければなりません。しかし、destruktorも例外をスローすることはできません。だから私は私のストリームを閉じないと、それはブロックの終わりに破壊される私は、閉鎖中に発生する可能性があるエラーについての情報が緩いかもしれません。

私の考えは正しいですか? RAIIのアプローチにもかかわらず、私はいつもストリームを閉じるべきですか?

例:

{ 
    std::ofstream ofs; 
    ofs.open ("test.txt"); 

    ofs << "blablabla"; 

    //do i need the following? 
    ofs.close(); 
} 
+0

ファイルストリームオブジェクトは、それが含まれているオブジェクトが破棄されたときに破棄する必要があります(したがって、例外をスローせずに閉じます)。デストラクタで明示的にファイルを閉じる必要はありません。 –

+0

いいえ、手作業で '.close()'する必要はありません。これはRAIIの全ポイントです。 – emlai

答えて

3

答えは、閉じている間にエラーに反応するかどうかを示します。あなたが反応するようにしたい場合は

、手動closeに持っていると、エラー状態をチェックし(failbitを設定します閉じることができない):あなたが反応しない場合

std::ofstream str; 
// Do something 
str.close(); 
if (str.fail()) { 
    // react on error 
} 

、なぜわざわざ?デストラクタにファイルを閉じるようにしてください。

3

あなたはfstreamデストラクタがファイルを閉じるようにする必要があります。

あなたが言ったように、デストラクタはスローしないので、ファイルを閉じるときにエラーが発生することはありませんが、メンバ関数の戻り値はvoidです。 。これについて心配しないでください。デストラクタが他のRAIIクラスの場合と同様にファイルを閉じることができます。


注意、fstreamを根底bufferclose()メンバ関数を持っています。この関数は、エラーがあった場合はNULL、成功した場合はポインタを返します。この関数はbasic_filebufのデストラクタから呼び出され、basic_fstreamのデストラクタから呼び出されます。あなたは通常の使用のもとでこれを直接呼び出すべきではありません。

関連する問題