Maison >développement back-end >C++ >Devriez-vous fermer manuellement un `ifstream` en C ?
Question :
Lors de l'utilisation de std::ifstream, devrions-nous manuellement invoquer close() ? RAII n'est-il pas utilisé par ifstream pour gérer automatiquement les fermetures de fichiers ?
Exemple de 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"); }
L'appel de file.close() est-il nécessaire ? Ifstream n'utilise-t-il pas RAII pour la fermeture des fichiers ?
Réponse :
Non.
RAII est conçu précisément dans ce but. Permettez au destructeur de remplir sa fonction prévue. La fermeture manuelle du fichier ne cause aucun dommage, mais elle s'écarte des conventions C et ressemble à une programmation en C avec des classes.
Si vous devez fermer le fichier avant la fin d'une fonction, vous pouvez utiliser des étendues imbriquées :
std::ifstream file(fileName.c_str()); { std::stringstream buffer; buffer << file.rdbuf(); } // scope ends; file closed here
Selon la norme (27.8.1.5, modèle de classe basic_ifstream), ifstream doit être implémenté avec un membre basic_filebuf qui héberge le fichier authentique poignée. Ce membre garantit que lorsqu'un objet ifstream est détruit, il appelle également le destructeur basic_filebuf. Et selon la norme (27.8.1.2), ce destructeur ferme le fichier :
virtual ˜basic_filebuf(); Effects: Destroys an object of class `basic_filebuf<charT,traits>`. Calls `close()`.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!