Maison >développement back-end >C++ >Dois-je fermer manuellement un « ifstream » en C ?
Dois-je fermer manuellement un ifstream ?
En C, l'acquisition des ressources est l'initialisation (RAII) garantit que les objets sont automatiquement nettoyés et libérés lorsqu'ils sortent de la portée. Ce mécanisme est utilisé dans diverses classes, notamment std::ifstream.
Lorsqu'un objet std::ifstream est créé, il ouvre le fichier spécifié pour la saisie. Par défaut, le fichier reste ouvert jusqu'à ce que l'objet soit détruit. Cependant, une question courante se pose : dois-je appeler explicitement file.close() manuellement ou puis-je compter sur RAII pour le gérer ?
La réponse est NON.
RAII et ifstream
Le but de RAII est précisément de réduire le besoin de nettoyage manuel des ressources. Dans le cas d'ifstream, le destructeur est responsable de la fermeture du fichier associé, rendant inutiles les appels explicites à file.close().
Dans l'exemple de code fourni, l'objet fichier est déclaré dans la portée de readContentsOfFile () fonction. Lorsque la fonction revient, l'objet sort de la portée et le destructeur est appelé automatiquement. Cela garantit que le fichier est fermé avant la fermeture de la fonction.
Portée imbriquée pour une fermeture anticipée
Bien que RAII garantisse la fermeture du fichier lors de la destruction de l'objet, il peut être souhaitable de fermer le fichier plus tôt dans une fonction. Ceci peut être réalisé en utilisant une portée imbriquée :
{ std::ifstream file(fileName.c_str()); if (file.good()) { std::stringstream buffer; buffer << file.rdbuf(); } file.close(); }
Dans la portée imbriquée, l'objet fichier est créé et ouvert. Si le fichier est valide, il est traité immédiatement et le fichier est fermé avant la fin de la portée interne.
Conclusion
std::ifstream s'occupe déjà du fichier fermeture via RAII. Les appels manuels à file.close() sont inutiles et doivent être évités car ils violent les principes de RAII en C .
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!