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 :

Impossible d'écrire dans un fichier


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2012
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Impossible d'écrire dans un fichier
    Bonjour,
    j'ai un problème avec le code suivant (je n'ai mis que ce qui me semblait utile) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FileName="fichierBidon"; 
    	ofstream data(FileName.c_str(), ios::out | ios::trunc);
     
    	for (int i=0; i<nombreDePoints; i++) 
    	{   		
    		data << i << endl;		
    	}

    Le fichier est bien créé, mais rien ne s'écrit dedans.
    Quelqu'un aurait une idée sur la raison du problème ? (j'ai bien inclus fstream)
    Merci d'avance !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Le code suivant fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <fstream>
    #include <ios>
     
    int main()
    {
    	std::string fileName = "fichierBidon.txt"; 
    	std::ofstream data(fileName.c_str(), std::ios::out | std::ios::trunc);
     
    	for (int i=0; i<5; i++) 
    		data << i << std::endl;		
    }

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Salut, je m'excuse si j'enfonce une porte ouverte, mais ne faudrait-il pas appeler close() après écriture pour s'assurer que les données sont bien flushées avant la fin du processus?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    close est automatiquement appelé à la destruction de l'objet, aucun risque à ce niveau.

    Le code fonctionne, si tenté que nombreDePoints soit > 0.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    My mistake, je avais zappé que bien sûr RAII oblige la destruction ferme le fichier...
    Si effectivement nombreDePoints est positif, il pourrait y avoir une erreur hors de contrôle du processus qui ne se voit pas faute de contrôle des signaux d'erreur...
    Ceci dit, une valeur aberrante de nombreDePoints semble le plus probable (le fichier étant créé...)

  6. #6
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Un détail : si je ne m'abuse dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	std::ofstream data(fileName.c_str(), std::ios::out | std::ios::trunc);
    std::ios::out est inutile (c'est le mode d'ouverture par défaut d'un ofstream, non ?) et l'on pourrait écrire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	std::ofstream data(fileName.c_str(), std::ios::trunc);
    Est-ce que je me trompe ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Le trunc n'a pas ailleurs pas d'effet, car c'est le mode par défaut (son complément étant append, qui lui, doit être impérativement précisé).

  8. #8
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    En effet le fichier sera forcément fermé, mais si tu fais juste confiance au RAII alors tu peux oublier l'idée d'être certain que les données ont bien été flushées.

  9. #9
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    En effet le fichier sera forcément fermé, mais si tu fais juste confiance au RAII alors tu peux oublier l'idée d'être certain que les données ont bien été flushées.
    Tu es bien sûr de ce que tu avances ?
    J'avais cru comprendre que le destructeur d'un ofstream appelait close() qui elle-même vide le tampon... et que c'était là un des principaux intérêts des ofstream...
    Je me trompe ?



    Citation Envoyé par oodini Voir le message
    Le trunc n'a pas ailleurs pas d'effet, car c'est le mode par défaut (son complément étant append, qui lui, doit être impérativement précisé).
    Finalement on peut donc remplacer le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	std::ofstream data(fileName.c_str(), std::ios::out | std::ios::trunc);
    par un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	std::ofstream data(fileName.c_str());

  10. #10
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    close retourne une valeur ou lance une exception qui correpsond (plus ou moins) à la réussite d'avoir flush les données. Ce que close assure c'est de fermer le fichier, pas de flusher les données (il tente néanmoins de la faire). Or si close est appelé à travers le destructeur (je ne rentre pas dans le détail que quel "close" est appelé), le retour ou l'excpetion est ignoré : le fichier est bien fermé mais il n'y a aucune assurance que les données soient flushées.

  11. #11
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Une lecture bien faite fait alors usage du manipulateur flush, qui règle ce problème.

  12. #12
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Pas exactement, si tu veux tout les détails, prends 1h et regardes la norme, tu verras que c'est pas si évident que ca que close ne puisse pas lancer après un << std::flush (c'est lié à overflow).

    D'autre part les exceptions ne rendent pas nécessairement compte de la validité de l'état du buffer (pour ca il faut utiliser rdstate), alors que close va forcément dire si quelque chose à rater.

    Pour fermer et pouvoir traiter correctement en cas de problèmes, à part un close avec un if autour, il n'y aura rien de plus clair, AMA. Après la question c'est de savoir si tu peux faire quelque chose en cas de problèmes, sinon ça sert à rien.

    PS: Je ne distingue pas lecture/écriture ici.

  13. #13
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    En tout cas merci pour ces indications et ces pistes... cela donne utilement à réfléchir.

Discussions similaires

  1. Impossible d'écrire dans un fichier
    Par paulo.arras dans le forum C
    Réponses: 10
    Dernier message: 20/09/2009, 19h39
  2. Impossible d'écrire dans le fichier de log
    Par JCitrouille dans le forum Logging
    Réponses: 2
    Dernier message: 07/08/2008, 12h52
  3. Impossible d'écrire dans un fichier
    Par Olivier Regnier dans le forum Langage
    Réponses: 2
    Dernier message: 25/01/2008, 09h20
  4. Impossible d'écrire dans un fichier
    Par laurentUTC dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/04/2007, 12h18

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