Dois-je fermer manuellement un ifstream?
Je dois manuellement appel 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? Ne devrait pas ifstream
faire usage de RAII pour la fermeture des fichiers?
Vous devez vous connecter pour publier un commentaire.
PAS
C'est ce que RAII est pour, laisser 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 voulez 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 unbasic_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 surbasic_filebuf
. Et de la norme (27.8.1.2), que destructeur ferme le fichier:close()
manuellement pour le traitement des erreurs.virtual __CLR_OR_THIS_CALL ~basic_filebuf() _NOEXCEPT { // destroy the object if (_Myfile != 0) _Reset_back(); // revert from _Mychar buffer if (_Closef) close(); }
Avez-vous besoin de fermer le fichier?
PAS de
Si vous fermez le fichier?
Dépend.
Faire vous vous souciez du possible les conditions d'erreur qui pourrait se produire si le fichier ne parvient pas à fermer correctement? Rappelez-vous que des appels à proximité,
setstate(failbit)
si elle échoue. Le destructeur va appelerclose()
automatiquement pour vous parce que de RAII mais ne vous laissera pas un moyen de tester l'échouer de peu que l'objet n'existe plus.Je suis d'accord avec @Martin. Si vous écrivez dans le fichier, les données peuvent toujours être assis sur un tampon et pourraient ne pas être écrit dans le fichier jusqu'à ce que
close()
est appelé. Sans le faire manuellement, vous n'avez aucune idée s'il y a une erreur ou pas. Ne pas signaler les erreurs à l'utilisateur est une très mauvaise pratique.Non, c'est fait automatiquement par le
ifstream
destructeur. La seule raison pour laquelle vous devriez l'appeler manuellement, c'est parce que lafstream
exemple, a une grande portée, par exemple si c'est une variable membre d'une longue vie instance de classe.Vous pouvez autoriser le destructeur de faire son travail. Mais comme toute RAII objet, il se peut que l'appel de fermer manuellement peut faire une différence. Par exemple:
écrit le contenu du fichier. Mais:
ne l'est pas. Ils sont rares les cas où un processus soudain sorties. Un processus qui se pourrait faire la même.