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

SL & STL C++ Discussion :

ofstream: detecter les erreurs d'ecriture


Sujet :

SL & STL C++

  1. #1
    Membre confirmé Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par défaut ofstream: detecter les erreurs d'ecriture
    Bonjour,

    Mon probleme est assez simple, et pourtant je ne parviens pas a trouver de solutions sur le net: comment detecter les erreurs lors de l'ecriture d'un fichier avec ofstream, et notamment le fait que le disque soit plein?

    J'ai essaye le code que l'on trouve dans la faq:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ofstream file( "fichier.txt" );
    if ( !file )
    {
        cerr << "Erreur de création\n";
        return;
    }
     
    file << "Une ligne\n";
    if ( ! file )
    {
        cerr << "Erreur d'écriture\n";
        return;
    }
    cout << "L'écriture a réussi\n";
    mais l'erreur n'est pas detectee (mon disque est plein, j'ecris dans le fichier un string beaucoup plus gros, et l'ecriture a bien echoue puisque la taille de fichier.txt est nulle).

    J'ai egalement teste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ! (file << "Une ligne\n") )
    ou encore:

    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
    ofstream file( "fichier.txt" );
    file << "Une ligne\n";
    if ( file.fail() || ! file.good() )
    {
        cerr << "Erreur de création\n";
        return;
    }
    file.flush();
    if ( file.fail() || ! file.good() )
    {
        cerr << "Erreur de création\n";
        return;
    }
    file.close();
    if ( file.fail() || ! file.good() )
    {
        cerr << "Erreur de création\n";
        return;
    }
    cout << "L'écriture a réussi\n";
    mais rien a faire, l'erreur d'ecriture n'est jamais detectee!

    Est-ce que vous sauriez comment faire?

    Merci d'avance,

    Romain

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    Déjà, je te déconseillerais ( mais ce n'est qu'un avis personnel, n'est-ce pas) l'utilisation d'un return vide...

    Je te conseillerais plutot d'utiliser le mécanisme d'exception lancée quand une erreur survient, et interceptée quand il est possible de les prendre en charge pour rendre le système cohérent

    Maintenant:
    • es tu sur que le disque est plein sur la machine de test
    • tu devrais sans doute plutôt t'intéresser au mécanismes propres au système d'exploitation pour détecter l'espace disponible sur le disque dur (car il n'y a à ma connaissance rien de portable en la matière)
    • tu trouvera la solution pour effectuer un test de lecture/d'écriture dans un fichier dans l'entrée correspondante de la FAQ
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Quel système utilises-tu ?

    Il existe des système qui dans le dos du C++ bufferisent les écritures, et du coup, le C++ ne peut pas voir qu'il y a eu un problème, puisque le problème n'a pas encore eu lieu, et donc ne le remonte pas.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    +1 il faut tester l'état du flux après avoir fait file.close()

  5. #5
    Membre confirmé Avatar de Romain93
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Par défaut
    Bonjour, et merci pour vos reponses!

    koala01: Oui en general j'essaie aussi d'eviter les return vides, la je n'avais fait que copier coller le code de la faq

    Je pense que mon test est bon: si je libere de l'espace et que je lance mon programme, fichier.txt a une certaine taille (environ 1Mo), mais si je remplis mon quota, et que je relance le programme, le fichier est cree mais a une taille nulle...

    jolyloic: Le programme tourne sous linux... j'essaierai d'avoir plus de details demain. Si le probleme est celui que tu decris... il n'y a pas de solution?

    Sylvain Togni: Oui, j'ai deja essaye, mais l'erreur n'est pas detectee...

    Merci,

    Romain

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Romain93 Voir le message
    j'essaierai d'avoir plus de details demain. Si le probleme est celui que tu decris... il n'y a pas de solution?
    Peut-être par des API spécifiques au système ? Je ne connais pas assez cet OS pour t'être plus utile...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. [ZF 1.11] Detecter les erreurs durant le développement
    Par themostmd dans le forum MVC
    Réponses: 4
    Dernier message: 22/08/2011, 18h04
  2. comment detecter les erreur de gestion memoire
    Par adel25 dans le forum Langage
    Réponses: 2
    Dernier message: 29/12/2009, 23h45
  3. Recuperer les erreurs des requetes sql en asp
    Par emile13 dans le forum ASP
    Réponses: 3
    Dernier message: 01/04/2004, 13h49
  4. [web] comment afficher les erreur d'un cgi
    Par chtiboss dans le forum Web
    Réponses: 6
    Dernier message: 24/12/2003, 11h22
  5. Empecher les erreurs du débogeurs
    Par remixtech dans le forum EDI
    Réponses: 9
    Dernier message: 04/06/2003, 13h45

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