234

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()手動で呼び出す必要がありますか? ファイルを閉じるためにRAIIifstreamを利用すべきではありませんか?

4

5 に答える 5

78

ファイルを閉じる必要がありますか?
いいえ

ファイルを閉じますか?
依存します。

ファイルが正しく閉じられなかった場合に発生する可能性のあるエラー状態について気にしますか? setstate(failbit)失敗した場合は close を呼び出すことを忘れないでください。デストラクタはRAIIclose()のために自動的に呼び出しますが、オブジェクトが存在しないため、フェイル ビットをテストする方法はありません。

于 2009-04-14T15:44:45.477 に答える
16

@マーティンに同意します。ファイルに書き込む場合、データはまだバッファに残っている可能性があり、close()が呼び出されるまでファイルに書き込まれない可能性があります。手動で行わないと、エラーが発生したかどうかわかりません。ユーザーにエラーを報告しないことは、非常に悪い習慣です。

于 2011-07-14T20:45:00.663 に答える
5

いいえ、これはifstreamデストラクタによって自動的に行われます。手動で呼び出す必要がある唯一の理由は、fstreamインスタンスのスコープが大きいためです。たとえば、インスタンスが長寿命のクラスインスタンスのメンバー変数である場合などです。

于 2009-04-15T09:24:43.820 に答える