ifstream f;
f.open(fileName);
if ( f.fail() )
{
// I need error message here, like "File not found" etc. -
// the reason of the failure
}
Comment obtenir un message d'erreur sous forme de chaîne?
c++
error-handling
stream
std
Alex F
la source
la source
cerr << "Error code: " << strerror(errno); // Get some info as to why
semble pertinent par rapport à la question.strerror(errno)
marche. Postez ceci comme réponse, je l'accepterai.Réponses:
Chaque appel système qui échoue met à jour la
errno
valeur.Ainsi, vous pouvez avoir plus d'informations sur ce qui se passe lorsqu'une
ifstream
ouverture échoue en utilisant quelque chose comme:Cependant, comme chaque appel système met à jour laerrno
valeur globale , vous pouvez rencontrer des problèmes dans une application multithread, si un autre appel système déclenche une erreur entre l'exécution def.open
et l'utilisation deerrno
.Sur système avec standard POSIX:
Edit (merci à Arne Mertz et à d'autres personnes dans les commentaires):
e.what()
semblait au début être une façon plus correcte d'implémenter cela en C ++, mais la chaîne retournée par cette fonction dépend de l'implémentation et (au moins dans la libstdc ++ de G ++) cette chaîne n'a pas d'informations utiles sur la raison de l'erreur ...la source
e.what()
ne semble pas donner beaucoup d'informations, voir les mises à jour de ma réponse.errno
utilise le stockage local des threads sur les systèmes d'exploitation modernes. Cependant, il n'y a aucune garantie que lesfstream
fonctions ne seront pas écraséeserrno
après un errno. Les fonctions sous-jacentes peuvent ne pas être définieserrno
du tout (appels système directs sous Linux ou Win32). Cela ne fonctionne pas sur de nombreuses implémentations du monde réel.e.what()
toujours le même message "iostream stream error
"warning C4996: 'strerror': This function or variable may be unsafe. Consider using strerror_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\string.h(168) : see declaration of 'strerror'
Vous pouvez essayer de laisser le flux lever une exception en cas d'échec:
e.what()
, cependant, ne semble pas très utile:strerror(errno)
donne "No such file or directory".Si
e.what()
cela ne fonctionne pas pour vous (je ne sais pas ce que cela vous dira sur l'erreur, car ce n'est pas standardisé), essayez d'utiliserstd::make_error_condition
(C ++ 11 uniquement):la source
strerror(errno)
publié dans les commentaires fonctionne et très simple à utiliser. Je pense quee.what
cela fonctionnera, car celaerrno
fonctionne.e.what()
ce sera ce quistrerror
revient, d'une manière threadsafe. Les deux dépendront probablement de la plate-forme.exception.what()
. Peut-être une bonne occasion de plonger dans le code source de libstdc ++ :-)basic_ios::clear
, rien d'autre. Ce n'est pas vraiment utile. C'est pourquoi je n'ai pasSuite à la réponse de @Arne Mertz, à partir de C ++ 11
std::ios_base::failure
hérite desystem_error
(voir http://www.cplusplus.com/reference/ios/ios_base/failure/ ), qui contient à la fois le code d'erreur et le message quistrerror(errno)
reviendrait.Cela s'imprime
No such file or directory.
sifileName
n'existe pas.la source
iostream stream error
.iostream error
. Sur quel compilateur avez-vous testé cela? Un compilateur fournit-il réellement une raison d'échec lisible par l'utilisateur?unspecified iostream_category error
.Vous pouvez également lancer un
std::system_error
comme indiqué dans le code de test ci-dessous. Cette méthode semble produire une sortie plus lisible quef.exception(...)
.Exemple de sortie (Ubuntu w / clang):
la source