Frage

Muss ich close() manuell aufrufen, wenn ich einen std::ifstream verwenden?

Zum Beispiel, in dem Code:

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");
}

Muss ich file.close() manuell anrufen? Sollte ifstream keinen Gebrauch von RAII für Dateien schließen?

War es hilfreich?

Lösung

NO

Dies ist, was RAH ist, lassen Sie den destructor seine Arbeit tun. Es gibt es manuell keinen Schaden zu schließen, aber es ist nicht die C ++ Art und Weise, es ist die Programmierung in C mit Klassen.

Wenn Sie die Datei vor dem Ende einer Funktion schließen Sie immer einen verschachtelten Bereich verwenden können.

In dem Standard (27.8.1.5 Vorlage Klasse basic_ifstream), ist ifstream mit einem basic_filebuf umgesetzt wird Mitglied der eigentliche Datei Griff halten. Es wird als Mitglied gehalten, so dass, wenn ein ifstream Objekt zerstört, sondern auch der destructor an basic_filebuf nennt. Und von dem Standard (27.8.1.2), dass destructor schließt die Datei:

  

virtual ˜basic_filebuf();

     

Effekte: Zerstört ein Objekt der Klasse basic_filebuf<charT,traits>. Anrufe close().

Andere Tipps

Sie benötigen die Datei schließen?
NO

Sollte schließen Sie die Datei?
Kommt drauf an.

Haben Sie Sorge, über die möglichen Fehlerbedingungen, die, wenn die Datei korrekt schließen nicht auftreten kann? Denken Sie daran, dass eine enge Anrufe setstate(failbit) wenn es fehlschlägt. Der Destruktor wird close() automatisch für Sie da von RAH nennen, aber Sie werden nicht einen Weg verlassen zu testen das Bit nicht, wenn das Objekt nicht mehr existiert.

Ich bin mit @ Martin. Wenn Sie in die Datei schreiben, können die Daten immer noch auf einem Puffer sitzen und nicht in die Datei geschrieben bekommen können bis close() genannt wird. Ohne es manuell zu tun, haben Sie keine Ahnung, ob es ein Fehler war oder nicht. Nicht die Berichterstattung Fehler ein Benutzer eine sehr schlechte Praxis ist.

Nein, dies wird automatisch durch das ifstream destructor getan. Der einzige Grund, warum Sie es manuell aufrufen sollte, ist, weil die fstream Instanz einen großen Anwendungsbereich, zum Beispiel hat, wenn es sich um eine Membervariable einer langen Lebensklasseninstanz ist.

können Sie erlauben die destructor es Arbeit zu tun. Aber wie jedes RAII Objekt es kann vorkommen, dass in der Nähe von Hand aufrufen kann einen Unterschied machen. Zum Beispiel:

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  return 0;
}

schreibt Dateiinhalte. Aber:

#include <stdlib.h>

#include <fstream>

using std::ofstream;

int main() {
  ofstream ofs("hello.txt");
  ofs << "Hello world\n";
  exit(0);
}

nicht. Diese sind selten Fälle, in denen ein Prozess plötzlich beendet wird. Ein Krachen Prozess könnte ähnlich tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top