Czy muszę ręcznie dzwonić, close()
gdy używamstd::ifstream
?
Na przykład w kodzie:
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");
}
Czy muszę dzwonić file.close()
ręcznie? Czy nie należy ifstream
używać RAII do zamykania plików?
close()
ręcznie w celu obsługi błędów.Czy musisz zamknąć plik?
NIE
Czy powinieneś zamknąć plik?
Zależy.
Czy zależy Ci na możliwych warunkach błędu, które mogą wystąpić, jeśli plik nie zostanie poprawnie zamknięty? Pamiętaj o zamkniętych połączeniach,
setstate(failbit)
jeśli się nie powiedzie. Destruktor zadzwoniclose()
do ciebie automatycznie z powodu RAII, ale nie pozostawi Ci możliwości przetestowania bitu niepowodzenia, ponieważ obiekt już nie istnieje.źródło
Zgadzam się z @Martin. Jeśli piszesz do pliku, dane mogą nadal znajdować się w buforze i mogą nie zostać zapisane do pliku, dopóki nie
close()
zostanie wywołane. Bez zrobienia tego ręcznie nie masz pojęcia, czy wystąpił błąd, czy nie. Niezgłaszanie błędów użytkownikowi jest bardzo złą praktyką.źródło
Nie, robi to automatycznie
ifstream
destruktor. Jedynym powodem, dla którego powinieneś wywołać go ręcznie, jest to, żefstream
instancja ma duży zasięg, na przykład, jeśli jest zmienną składową instancji klasy długo żyjącej.źródło
Możesz pozwolić destruktorowi wykonać swoją pracę. Ale podobnie jak każdy obiekt RAII może się zdarzyć, że ręczne wywołanie metody close może mieć znaczenie. Na przykład:
zapisuje zawartość pliku. Ale:
nie. Są to rzadkie przypadki, gdy proces nagle kończy się. Awaria procesu może zrobić podobnie.
źródło