Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do I need to manually close an ifstream?

Tags:

c++

raii

ifstream

Do I need to manually 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?

like image 624
Edison Gustavo Muenz Avatar asked Apr 14 '09 14:04

Edison Gustavo Muenz


People also ask

Do you need to close an ifstream?

No, this is done automatically by the ifstream destructor. The only reason you should call it manually, is because the fstream instance has a big scope, for example if it is a member variable of a long living class instance.

Does ifstream automatically close the file?

Note that any open file is automatically closed when the ifstream object is destroyed.

Do you need to close file in C++?

C++ File Handling close() FunctionA file which is opened while reading or writing in file handling must be closed after performing an action on it.

What happens if you don't close a Filestream?

There is no difference. The file stream's destructor will close the file.


2 Answers

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), 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<charT,traits>. Calls close().

like image 173
Eclipse Avatar answered Sep 27 '22 21:09

Eclipse


Do you need to close the file?
NO

Should you close the file?
Depends.

Do you care about the possible error conditions that could occur if the file fails to close correctly? Remember that close calls setstate(failbit) if it fails. The destructor will call close() for you automatically because of RAII but will not leave you a way of testing the fail bit as the object no longer exists.

like image 25
Martin York Avatar answered Sep 27 '22 21:09

Martin York