Maison > développement back-end > C++ > Devriez-vous fermer manuellement un `ifstream` en C ?

Devriez-vous fermer manuellement un `ifstream` en C ?

Patricia Arquette
Libérer: 2024-11-26 00:32:09
original
296 Les gens l'ont consulté

Should You Manually Close an `ifstream` in C  ?

La fermeture d'un ifstream améliore-t-elle manuellement RAII ?

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");
}
Copier après la connexion

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
Copier après la connexion

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()`.
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal