Gestion des erreurs en C ++ lors de l'ouverture d'un fichier

Lorsque vous ouvrez un fichier, toutes sortes de choses peuvent mal se passer. Un fichier vit sur un dispositif physique - un disque fixe, par exemple, ou peut-être sur une carte de lecteur flash ou SD - et vous pouvez rencontrer des problèmes lorsque vous travaillez avec des périphériques physiques.

Par exemple, une partie du disque peut être endommagé, provoquant un fichier existant à être endommagé. Ou, moins désastreux, vous pourriez manquer d'espace disque. Ou, encore moins désastreuse, vous pouvez essayer d'ouvrir un fichier dans un répertoire inexistant.

Si vous essayez d'ouvrir un fichier en écriture en spécifiant un chemin complet et le nom mais ne existe dans le répertoire, l'ordinateur réagit différemment, en fonction du système d'exploitation que vous utilisez. Si vous ne savez pas comment votre système d'exploitation particulier répondra, essayer d'écrire une application de test simple qui essaie de créer quelque chose d'ouvert et comme /abc/def/ghi/jkl/abc.txt. (Bien sûr, vous voulez être sûr d'utiliser un répertoire qui ne existe pas.)

Puis l'une des deux choses l'une: ou bien le répertoire et le fichier aura créé ou ne se passera rien.

Par exemple, sur un système Windows, si nous essayons de créer un fichier dans un répertoire inexistant, le système ne crée pas le répertoire. Voilà parce que profondément à l'intérieur, l'application appelle finalement une fonction du système d'exploitation qui fait le sale boulot de la création du fichier. Et cette fonction du système d'exploitation particulier (il est appelé CreateFile (), si vous même des soins) a une règle qu'il ne va pas créer un répertoire pour vous.

Si vous souhaitez déterminer si le ostream classe n'a pas pu créer un fichier, vous pouvez appeler sa échec () fonction de membre. Cette fonction renvoie vrai si l'objet n'a pas pu créer le fichier. Et voilà ce qui arrive lorsqu'il n'y a pas un répertoire. La DirectoryCheck01 exemple représenté montre un exemple de cela.

#comprendre #comprendre using namespace main () {ofstream outfile std-int ("/ ABC / DEF / ghi / MonFichier.txt") - si (outfile.fail ()) {cout lt; lt; "Impossible d'ouvrir le fichier!" lt; lt; endl-retour 0- outfile} lt; lt; "Salut" lt; lt; endl-outfile.close () - retour 0-}



Lorsque vous exécutez ce code, en supposant que vous ne disposez pas d'un répertoire appelé / ABC / DEF / ghi sur votre système, vous devriez voir le message Impossible d'ouvrir le fichier! En supposant que votre système d'exploitation particulier ne crée pas un répertoire dans ce dence si elle ne, votre ordinateur va ouvrir le fichier, écrire salut à elle, et de passer avec sa vie heureuse après la fermeture de choses.

Comme alternative à l'appel de la échec () fonction membre, vous pouvez utiliser un opérateur disponible en différentes classes de flux. Ceci est!, Affectueusement dénommé “ Bang ” l'opérateur, et vous l'utiliser à la place de l'appel échec (), comme dans le code suivant:

if (! outfile) {cout lt; lt; "Impossible d'ouvrir le fichier!" lt; lt; endl-retour 0-}

La plupart des gens préfèrent utiliser !outfile au lieu de outfile.fail (), bien que !outfile rend le code source de confusion. La raison en est que outfile est un objet, et la notion de !outfile n'a tout simplement pas de sens.

En fait, !outfile voyages jusqu'à de nombreux programmeurs débutants. Ils savent que outfile est pas un pointeur dans cet exemple de code, et ils se demandent comment vous pourriez tester contre 0 que vous ne pouvez le faire normalement avec un pointeur. (Rappelez-vous, en disant !X, où X est certaine pointeur, vous testez X contre 0.) Et que n'a tout simplement pas de sens! Et donc, pour éviter toute confusion, il suffit d'appeler échec (). Il est plus logique.

Voici quelques raisons pour la création de votre fichier peut étouffer:

  • Ne existe pas le répertoire.

  • Vous êtes hors de l'espace disque et de chance.

  • Votre demande n'a pas les permissions nécessaires pour créer un fichier.

  • Le nom de fichier est invalide - qui est, il contenait des caractères du système d'exploitation ne permet pas un nom de fichier, tels que * ou?.

Comme toute bonne application, votre application doit faire deux choses:

  1. 1.Vérifiez si une création de fichier réussi.

  2. 2.Si la création du fichier a échoué, gérer de manière appropriée.

    Ne vous contentez pas d'imprimer un message horribles comme Oops! Abandon!, laissant vos utilisateurs pauvres d'autre choix que de jeter le moniteur sur le sol. Au lieu de cela, faire quelque chose de plus convivial - comme présentant un message leur disant qu'il ya un problème et en suggérant qu'ils pourraient libérer plus d'espace disque.


» » » » Gestion des erreurs en C ++ lors de l'ouverture d'un fichier