Muss ich manuell anrufen, close()
wenn ich a verwende std::ifstream
?
Zum Beispiel im 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 nicht ifstream
Gebrauch machen RAII zum Schließen von Dateien?
close()
zur Fehlerbehandlung manuell aufrufen .Müssen Sie die Datei schließen?
NEIN
Sollten Sie die Datei schließen?
Hängt davon ab.
Interessieren Sie sich für mögliche Fehlerbedingungen, die auftreten können, wenn die Datei nicht ordnungsgemäß geschlossen wird? Denken Sie daran, dass Anrufe schließen,
setstate(failbit)
wenn dies fehlschlägt. Der Destruktor ruftclose()
Sie aufgrund von RAII automatisch auf , lässt Ihnen jedoch keine Möglichkeit, das Fehlerbit zu testen, da das Objekt nicht mehr vorhanden ist.quelle
Ich stimme @Martin zu. Wenn Sie in die Datei schreiben, befinden sich die Daten möglicherweise noch in einem Puffer und werden möglicherweise erst in die Datei geschrieben, wenn sie
close()
aufgerufen werden. Ohne dies manuell zu tun, haben Sie keine Ahnung, ob ein Fehler aufgetreten ist oder nicht. Es ist eine sehr schlechte Praxis, einem Benutzer keine Fehler zu melden.quelle
Nein, dies wird automatisch vom
ifstream
Destruktor durchgeführt. Der einzige Grund, warum Sie es manuell aufrufen sollten, ist, dass diefstream
Instanz einen großen Umfang hat, beispielsweise wenn es sich um eine Mitgliedsvariable einer langlebigen Klasseninstanz handelt.quelle
Sie können dem Destruktor erlauben, seine Arbeit zu erledigen. Aber genau wie bei jedem RAII-Objekt kann es vorkommen, dass ein manueller Aufruf zum Schließen einen Unterschied macht. Beispielsweise:
schreibt Dateiinhalte. Aber:
nicht. Dies sind seltene Fälle, in denen ein Prozess plötzlich beendet wird. Ein Absturzprozess könnte ähnlich ablaufen.
quelle