2008-11-20 4 views
12

Existe-t-il un moyen d'obtenir une condition d'erreur spécifique lorsqu'un flux C++ ouvert échoue? C'est-à-dire, si elle a échoué parce que le fichier n'existait pas, ou les permissions étaient erronées, ou etc. Fondamentalement, je cherche une fonctionnalité équivalente à errno pour fopen() en langage simple C.Pouvez-vous obtenir une condition d'erreur spécifique lorsqu'un flux C++ ouvert échoue?

GCC semble définir errno correctement , mais cela ne semble pas être requis par la norme C++ et je ne peux pas déterminer si c'est juste un artefact de la façon dont ils ont implémenté les flux, ou une fonctionnalité délibérée (et donc je ne sais pas si elle persistera versions).

Existe-t-il un moyen d'obtenir cette information de manière fiable, que ce soit en C++ standard ou non-accidentellement dans un ou plusieurs compilateurs majeurs?

Répondre

0

Dans Visual Studio, fopen et similaire définissent la valeur du dernier code d'erreur. Il peut être récupéré avec GetLastError(). Le résultat sera l'une des valeurs these.

+0

Avez-vous un lien vers l'emplacement du document VS? J'ai regardé les pages de flux sur MSDN mais je ne trouve aucune mention de ce comportement. Je ne dis pas que ça ne marche pas comme ça mais ça serait bien de voir un document officiel. –

+0

Je ne pense pas qu'il est présenté dans les documents VS. Ou peut-être que mon google-foo est trop faible. Cependant j'ai trouvé plusieurs messages de forum soutenant mon souvenir que fopen et semblable sont tous les wrappers autour de leurs fonctions équivalentes de winapi. Donc fopen appelle réellement CreateFile, qui définit le code d'erreur. Quoi qu'il en soit, un test rapide devrait le corroborer (au moins pour simuler facilement les erreurs de fichier). Je le ferais moi-même et afficherais les résultats. Mais, hélas, je n'ai pas facilement accès au studio visuel pour le moment. –

4

Vous pouvez consulter les indicateurs ios (badbit, eofbit, failbit, goodbit) pour des raisons générales. Il sera plus facile de tester avec ios :: bad(), ios :: fail(), ios :: eof() ou ios :: good(). Le flux peut également être configuré pour générer des exceptions en cas d'erreur, en utilisant ios :: exceptions().

Des rapports d'erreurs d'E/S détaillées peuvent être disponibles dans certaines implémentations, comme vous le signalez pour GCC. Vous devrez peut-être compter sur ce comportement pour les différents compilateurs. S'il y a une chance pour plusieurs compilateurs, assurez-vous de tester et probablement inclure des instructions de préprocesseur pour vérifier le compilateur en cours, etc.
Pour autant que je sache, le seul autre endroit dont il est question est proposed TR2 additions.

Questions connexes