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? Ne devrait pas ifstream
utiliser RAII pour fermer des fichiers?
close()
manuellement pour la gestion des erreurs.Avez-vous besoin de fermer le fichier?
NON
Devez-vous fermer le fichier?
Dépend.
Vous souciez-vous des conditions d'erreur possibles qui pourraient se produire si le fichier ne se ferme pas correctement? N'oubliez pas que fermer les appels en
setstate(failbit)
cas d'échec. Le destructeurclose()
vous appellera automatiquement à cause de RAII mais ne vous laissera pas un moyen de tester le bit d'échec car l'objet n'existe plus.la source
Je suis d'accord avec @Martin. Si vous écrivez dans le fichier, les données peuvent toujours être stockées dans un tampon et peuvent ne pas être écrites dans le fichier avant l'
close()
appel. Sans le faire manuellement, vous n'avez aucune idée s'il y a eu une erreur ou non. Ne pas signaler d'erreurs à un utilisateur est une très mauvaise pratique.la source
Non, cela se fait automatiquement par le
ifstream
destructeur. La seule raison pour laquelle vous devez l'appeler manuellement, c'est parce que l'fstream
instance a une grande portée, par exemple s'il s'agit d'une variable membre d'une instance de classe longue durée.la source
Vous pouvez permettre au destructeur de faire son travail. Mais tout comme n'importe quel objet RAII, il peut arriver que l'appel manuel à close fasse une différence. Par exemple:
écrit le contenu du fichier. Mais:
non. Ce sont de rares cas où un processus se termine soudainement. Un processus de plantage pourrait faire de même.
la source