patterncppCritical
Do I need to manually close an ifstream?
Viewed 0 times
manuallyifstreamneedclose
Problem
Do I need to manually call
For example, in the code:
Do I need to call
close() when I use a std::ifstream?For example, in the 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");
}Do I need to call
file.close() manually? Shouldn't ifstream make use of RAII for closing files?Solution
NO
This is what RAII is for, let the destructor do its job. There is no harm in closing it manually, but it's not the C++ way, it's programming in C with classes.
If you want to close the file before the end of a function you can always use a nested scope.
In the standard (27.8.1.5 Class template basic_ifstream),
Effects: Destroys an object of class
This is what RAII is for, let the destructor do its job. There is no harm in closing it manually, but it's not the C++ way, it's programming in C with classes.
If you want to close the file before the end of a function you can always use a nested scope.
In the standard (27.8.1.5 Class template basic_ifstream),
ifstream is to be implemented with a basic_filebuf member holding the actual file handle. It is held as a member so that when an ifstream object destructs, it also calls the destructor on basic_filebuf. And from the standard (27.8.1.2), that destructor closes the file:virtual ˜basic_filebuf();Effects: Destroys an object of class
basic_filebuf. Calls close().Context
Stack Overflow Q#748014, score: 326
Revisions (0)
No revisions yet.