Heim >Backend-Entwicklung >C++ >Sollten Sie einen „ifstream' in C manuell schließen?

Sollten Sie einen „ifstream' in C manuell schließen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-26 00:32:09254Durchsuche

Should You Manually Close an `ifstream` in C  ?

Verbessert das manuelle Schließen eines ifstream RAII?

Frage:

Wenn wir std::ifstream verwenden, sollten wir dies manuell tun? close() aufrufen? Wird RAII nicht von ifstream verwendet, um Dateischließungen automatisch zu verarbeiten?

Beispielcode:

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

Ist der Aufruf von file.close() notwendig? Verwendet ifstream nicht RAII zum Schließen von Dateien?

Antwort:

Nein.

RAII wurde entwickelt genau zu diesem Zweck. Erlauben Sie dem Destruktor, seine beabsichtigte Funktion auszuführen. Das manuelle Schließen der Datei verursacht keinen Schaden, weicht jedoch von den C-Konventionen ab und ähnelt dem Programmieren in C mit Klassen.

Wenn Sie die Datei vor dem Ende einer Funktion schließen müssen, können Sie verschachtelte Bereiche verwenden:

std::ifstream file(fileName.c_str());
{
    std::stringstream buffer;
    buffer << file.rdbuf();
} // scope ends; file closed here

Gemäß dem Standard (27.8.1.5, Klassenvorlage basic_ifstream) sollte ifstream mit einem basic_filebuf-Mitglied implementiert werden, das beherbergt der echte Dateigriff. Dieses Mitglied stellt sicher, dass, wenn ein ifstream-Objekt zerstört wird, auch der Destruktor basic_filebuf aufgerufen wird. Und gemäß dem Standard (27.8.1.2) schließt dieser Destruktor die Datei:

virtual ˜basic_filebuf();
Effects: Destroys an object of class `basic_filebuf<charT,traits>`. Calls `close()`.

Das obige ist der detaillierte Inhalt vonSollten Sie einen „ifstream' in C manuell schließen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn