IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Ecriture dans un fichier et exception


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut Ecriture dans un fichier et exception
    Bonjour,

    Pour écrire dans un fichier, j'utilise le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ofstream ECR("fichier.txt", ios_base::app);
     
    if(ECR)
    {
         ECR << "contenu";
         ECR.close();
    }
    Mais j'aimerais traiter le cas où il n'y a plus d'espace sur le disque pour écrire dans le fichier. J'ai pensé aux exceptions, et j'ai lu que ios_base::failure était lancée en cas d'erreur sur les flux, mais j'ai pu lire qu'elle est lancée "by functions in the iostreams library". Simple vérification : fstream fait-elle bien partie de cette bibliothèque ?

    Et au cas où je dise des bêtises depuis le début avec mes exceptions, quel autre moyen puis-je mettre en oeuvre ? Un simple "else" sur le teste du flux ECR ?

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjour,
    Si une erreur se produit dans l'operateur <<, certains flags interne au flux seront mis a true: eofbit, failbit, ou badbit.
    Pour les tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ECR << "contenu";
    if(ECR.eof())
     ;//gestion de l'erreur
    if(ECR.fail())
     ;//gestion de l'erreur
    if(ECR.bad())
     ;//gestion de l'erreur
     
    //Ou bien la version courte:
    if(ECR.good() == false)
     ;//gestion de l'erreur
    //ou encore
    if(!ECR)
     ;//gestion de l'erreur
    Ce comportement peut être modifié pour utiliser les exceptions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    try
    {
      ofstream ECR("fichier.txt", ios_base::app);
      ECR.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );
     
      if(ECR.is_open())
      {
         ECR << "contenu";
         ECR.close();
      }
    }
    catch(std::ios_base::failure &ex)
    {
      ;//gestion de l'erreur
    }
    En revanche l'échec d'ouverture du fichier ne peut (apparemment) pas lancer d'exception, donc un simple 'else' semble être la seul solution.

    A voir:
    http://www.cplusplus.com/reference/i...perator%3C%3C/
    http://www.cplusplus.com/reference/i...os/exceptions/
    http://cpp.developpez.com/faq/cpp/?p...re_ecriture_ok

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Nogane Voir le message
    Ce comportement peut être modifié pour utiliser les exceptions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    try
    {
      ofstream ECR("fichier.txt", ios_base::app);
      ECR.exceptions ( ifstream::eofbit | ifstream::failbit | ifstream::badbit );
     
      if(ECR.is_open())
      {
         ECR << "contenu";
         ECR.close();
      }
    }
    catch(std::ios_base::failure &ex)
    {
      ;//gestion de l'erreur
    }
    En revanche l'échec d'ouverture du fichier ne peut (apparemment) pas lancer d'exception, donc un simple 'else' semble être la seul solution.
    Super, merci ! Petite précision : dans le catch, si je veux différencier les différentes exceptions, il me suffit de faire des tests du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(ex.what() == "ifstream::failbit")
    ça suffira ?

    Dernière question un petit plus basique : si la partie ofstream se fait dans une autre fonction et que je veux que l'exception soit traitée dans la fonction appelante, est-ce que je dois préciser throw std::ios_base::failure, ou bien elle sera automatiquement lancée un niveau au dessus ?

    Ceci est-il correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    try
    {
         fct_ofstram(contenu);
    }
    catch(std::ios_base::failure &e)
    {
         /* traitement */
    }
     
    où
     
    void fct_ofstream(string contenu)
    {
         ofstream ECR("fichier.txt", ios_base::app);
         ECR.exceptions(ifstream::failbit | ifstream::eofbit);
     
         if(ECR)
         {
              ECR << contenu;
              ECR.close();
         }
     
         // est-ce correct ici ?
         throw std::ios_base::failure;
         // ou plutot :
         if(ECR.fail() || ECR.eof())
                  throw std::ios_base::failure;
    }

  4. #4
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Tu n'as même pas besoin de relancer ton exception, si elle n'est pas attrapée dans la fonction où elle est générée, elle passera automatiquement à la fonction du dessus, les remontant les unes après les autres jusqu'à ce qu'elle soit attrapée (ou bien si ton programme ne la gère pas du tout, c'est ton système d'exploitation qui finira par la récupérer et tuer ton programme mais ça, c'est à éviter quoi^^).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    try
    {
         fct_ofstram(contenu);
    }
    catch(std::ios_base::failure &e)
    {
         /* traitement */
    }
     
    void fct_ofstream(string contenu)
    {
         ofstream ECR("fichier.txt", ios_base::app);
         ECR.exceptions(ifstream::failbit | ifstream::eofbit);
     
         if(ECR)
         {
              ECR << contenu;
              ECR.close();
         }
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Génial, merci beaucoup pour vos réponses, tout est résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme d'ecriture dans un fichier texte
    Par azrael88370 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/01/2005, 17h33
  2. Script shell - écriture dans un fichier
    Par Leishmaniose dans le forum Linux
    Réponses: 6
    Dernier message: 13/12/2004, 22h48
  3. Probleme d'ecriture dans un fichier en mode Text
    Par bbozet dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/01/2004, 13h46
  4. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  5. Réponses: 2
    Dernier message: 26/09/2003, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo