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 de lire 2 fois de suite un fichier


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Points : 22
    Points
    22
    Par défaut impossible de lire 2 fois de suite un fichier
    Bonsoir a tous
    Voila j'ai un fichier texte sur lequel j'effectue des traitements.
    Une partie de mon programme pose probleme.
    En fait la fonction affiche() ne peut s'effectuer 2 fois de suite correctement.La seconde n'affiche rien ce qui est normal.
    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
     
    #include<fstream>
    using namespace std;
     
    fstream f ("personnel.txt",f.in | f.out );
    void affiche(){
          char *courant;
          while(f.getline(courant,100)) {
                     cout<<courant<< "  nbre de caract. lus: ";
                     int n=f.gcount();cout<<n<<endl;
          }
              // ici un 'f.clear();' fait buguer le programme en 
              // annonçant que l'exe doit fermer!!!  
          cout<<"etat: "<<f.rdstate()<<endl;// affiche 6 donc failbit 
                                            // et eofbit activés ce qui est normal
          f.seekg(0);cout<<"position pointeur: "<<f.tellg()<<endl;// affiche -1 
    }
     
    main() {
        affiche();  //ok pas de probleme
        affiche();  //probleme évidemment car good()==false donc pas d'entree ds le while
        f.close();
    }
    Est t'il possible de remédier à ce probleme sans avoir à fermer le fichier et a le rouvrir pour que cela marche?
    Comment réactiver goodbit a la fin de affiche() etant donné que je ne peux pas compter sur l'instruction clear() pour le faire???!!
    D'avance merci

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Il faut bien un clear pour pouvoir remettre à zéro les bits d'état du flux. Et ce n'est pas lui qui fait bugguer le programme mais ta mauvaise utilisation de la mémoire.

    Je sais que tu insistes pour utiliser les char *, mais c'est une erreur. Non seulement le code est moins souple (Dans la FAQ de Bjarne Stroustrup tu trouveras un article sur le pourquoi le C++ doit être enseigné comme un langage à part entière, regarde bien les deux codes présentés en parallèle), mais en plus il est plus facile de commettre des erreurs.

    De même que dans tes fonctions de convertions, tu n'alloues pas correctement la mémoire que doit utiliser ton programme, et tu ne la libères pas non plus.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    ok Merci... j'ai donc du taf en perspective....
    Si je m'entete a utiliser les char *, c 'est que j'ai pas encore étudié la classe string.
    Toujours est t'il que je ne vois pas ce qui fait buguer mon programme
    Faut que j'alloue de la mémoire dynamiquement ?
    Et puis pourquoi deleter dans le cas de petites applications puisque le compilateur le fait à la fin du programme?

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Encore merci monsieur Hermitte,c'etait bien un probleme d'alloc

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Présenter les char * avant les std::string est un boulet historique que se coltinent certains livres et cours sur le C++. Ce n'est ni ce qu'il y a de plus simple à utiliser, ni ce qui va vraiment servir en industrie -- les classes de gestion des chaines de caractères étant fortement recommandées.
    Bref.

    Sinon oui, il faut TOUJOURS allouer la mémoire dans laquelle on veut stocker des choses.
    Dans un cas pareil, savoir si il faut ou non se souvenir des diverses lignes peut influencer sur le fait que l'on aurait utilisé un tableau statique de caractères plutôt qu'un tableau dynamique (-ment alloué).
    Mais ces approches sont super limitaives (lignes à dimensions fixes si on veut le code simple à maintenir) et rapidement fausses (vu qu'en C++ new[] doit lever une exception s'il ne peut allouer de mémoire ; ce qui devient rapidement inmaintenable quand on n'enveloppe pas nos resources).

    Pour la libération, petit programme ou pas, c'est une bonne habitude à prendre que de libérer les ressources que l'on alloue. Pourquoi apprendre à pisser des lignes fausses quand on peut apprendre à pisser des lignes justes et plus simples ?
    (Et ce n'est pas le compilo, mais seulement certains OS qui récupèrent la mémoire (et je crois bien uniquement cette ressource ci))
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    ok merci de ces explications.
    En effet je potasse le bouquin de Dellanoy.
    (Qui n'est pas terrible d'ailleurs!Maintes sujets dont celui de l'allocation dynamique sont succintement abordés.De plus il faut connaitre le C avant de le lire et Monsieur Delannoy se garde bien de le dire dans son intro!!
    Je ne connais pas le C j'ai juste fait de l'ADA.)
    Merci pour ces considerations.
    Mais alors
    Sinon oui, il faut TOUJOURS allouer la mémoire dans laquelle on veut stocker des choses.
    Si je déclare il faut que l'alloue de la memoire par Ou c'est fait automatiquement ???[/code][/quote]

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    pardon je délire
    int j;j=new int;
    C'estLa memoire pour p est allouée.Basta.Je vais me coucher....

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Si je déclare
    Code:
    int j;

    il faut que l'alloue de la memoire par
    Code:
    j=new int;

    Ou c'est fait automatiquement ???
    Oui c'est fait automatiquement.

    Un "int" a une taille fixe que tu peux retrouver avec sizeof. Comme ton compilateur connaît la taille d'un "int", ben il le fait tout seul comme un grand. Et comme c'est lui qui a alloué ce "int", c'est lui qui va le désalloué encore tout seul comme un grand.

    Par contre si tu alloues explicitement de la mémoire avec l'opérateur new, alors la oui tu dois libérer ce que tu as alloué avec delete. [/quote]

  9. #9
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    OUPS...

    suis trop long pour répondre aux messages...

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

Discussions similaires

  1. Impossible de relancer mon interface deux fois de suite
    Par nini_python dans le forum Tkinter
    Réponses: 7
    Dernier message: 29/07/2012, 10h17
  2. Impossible de compiler 2 fois de suite
    Par Stnaire dans le forum Visual Studio
    Réponses: 0
    Dernier message: 01/05/2012, 04h59
  3. Lire un même caractère 2 fois de suite
    Par H.Filbert dans le forum C
    Réponses: 12
    Dernier message: 01/05/2006, 15h25
  4. [Test][Perf]Mesure du temps d'execution différente 2 fois de suite
    Par debdev dans le forum Tests et Performance
    Réponses: 11
    Dernier message: 22/07/2005, 12h04
  5. [VB.NET] Impossible de lire le contenu du datagrid
    Par jagdjg dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/05/2004, 21h51

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