252 votes

Dois-je fermer manuellement un ifstream?

Dois-je appeler manuellement close () lorsque j'utilise un std :: ifstream?

Par exemple dans le 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");
}
 

Dois-je appeler file.close () manuellement? Ifstream ne devrait-il pas utiliser RAII pour fermer des fichiers?

J'ai parcouru la plupart des questions ici et aucune ne traitait de cela.

Merci

303voto

Eclipse Points 27662

PAS de

C'est ce que RAII est, le destructeur de faire son travail. Il n'y a pas de mal à le fermer manuellement, mais ce n'est pas le C++ façon, c'est de la programmation en C avec des classes.

Si vous souhaitez fermer le fichier avant la fin d'une fonction, vous pouvez toujours utiliser un imbriquée portée.

Dans la norme (27.8.1.5 modèle de Classe basic_ifstream), ifstream est mise en œuvre avec un basic_filebuf membre détenant le réel descripteur de fichier. Il est considéré comme un membre de sorte que quand un ifstream objet détruit, il appelle le destructeur sur basic_filebuf. Et de la norme (27.8.1.2), que destructeur ferme le fichier:

virtual ˜basic_filebuf();

Effets: Détruit un objet de la classe basic_filebuf<charT,traits>. Appels close().

82voto

Loki Astari Points 116129

Devez-vous fermer le fichier?
NON

Si vous fermez le fichier?
Dépend.

Vous souciez-vous des éventuelles conditions d'erreur qui pourraient survenir si le fichier ne se ferme pas correctement? N'oubliez pas que fermer appelle setstate (failbit) en cas d'échec. Le destructeur appellera automatiquement close () à cause de RAII mais ne vous laissera pas un moyen de tester le bit de panne car l'objet n'existe plus.

15voto

Mark Edwards Points 41

Je suis d'accord avec @Martin. Si vous écrivez dans le fichier, les données peuvent toujours être placées sur un tampon et peuvent ne pas être écrites dans le fichier tant que close() n'est pas appelé. Sans le faire manuellement, vous n'avez aucune idée s'il y avait une erreur ou non. Ne pas signaler les erreurs à un utilisateur est une très mauvaise pratique.

6voto

Dimitri C. Points 6455

Non, cela est fait automatiquement par le destructeur ifstream. La seule raison pour laquelle vous devez l'appeler manuellement est que l'instance fstream a une grande portée, par exemple si elle est une variable membre d'une instance de classe longue et vivante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X