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!