質問
手動で電話をかける必要がありますか close()
を使用するとき std::ifstream
?
たとえば、コードでは次のようになります。
std::string readContentsOfFile(std::string fileName) {
std::ifstream file(fileName.c_str());
if (file.good()) {
std::stringstream buffer;
buffer << file.rdbuf();
file.close();
return buffer.str();
}
throw std::runtime_exception("file not found");
}
電話する必要がありますか file.close()
手動で?すべきではありません ifstream
利用する ライ ファイルを閉じるためですか?
解決
いいえ
これが RAII の目的であり、デストラクターにその仕事をさせます。手動で閉じても問題はありませんが、これは C++ の方法ではなく、クラスを使用して C でプログラミングすることになります。
関数の終了前にファイルを閉じたい場合は、いつでもネストされたスコープを使用できます。
標準(27.8.1.5 クラステンプレートbasic_ifstream)では、 ifstream
で実装されることになります basic_filebuf
実際のファイルハンドルを保持するメンバー。これはメンバーとして保持されるため、ifstream オブジェクトが破棄されると、デストラクターも呼び出されます。 basic_filebuf
. 。そして、標準 (27.8.1.2) では、そのデストラクターはファイルを閉じます。
virtual ˜basic_filebuf();
効果: クラスのオブジェクトを破棄します
basic_filebuf<charT,traits>
. 。電話close()
.
他のヒント
ファイルをクローズする必要がありますか?
NO
あなたは、ファイルを閉じるべきでしょうか?
依存ます。
あなたは、ファイルが正しくクローズに失敗した場合に発生する可能性が考えられるエラー状態を気ですか?それが失敗した場合に近い呼び出しがsetstate(failbit)
ことを覚えておいてください。デストラクタは、理由の RAII ので自動的にclose()
を呼び出しますが、あなたのオブジェクトがもう存在しないとして、フェイルビットをテストしていないの道を残すことはありません。
私は@Martinに同意します。あなたはファイルに書き込む場合は、データがまだバッファに座ってすることができるとclose()
が呼び出されるまでファイルに書き込まれないことがあります。手動でそれをやってなければ、そこにエラーだったかどうかはわかりません。ユーザーにエラーを報告していないことは非常に悪い習慣です。
いいえ、これはifstream
のデストラクタによって自動的に行われます。 fstream
インスタンスは、例えば、大きな範囲を持っているので、それが長い間生きているクラスのインスタンスのメンバ変数がある場合は、手動で呼び出す必要があります唯一の理由は、あるます。
あなたはデストラクタはそれが仕事だ行うことを許可することができます。しかし、ただのRAIIオブジェクトのように手動でクローズ呼び出すと、違いを作ることができることがあるかもしれません。たとえばます:
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
return 0;
}
は、ファイルの内容を書き込みます。しかします:
#include <stdlib.h>
#include <fstream>
using std::ofstream;
int main() {
ofstream ofs("hello.txt");
ofs << "Hello world\n";
exit(0);
}
ません。これらは、プロセスが突然終了しまれなケースです。クラッシュしたプロセスは、同様の操作を行うことができます。