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 :

seekg, lecture de fichier


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Points : 67
    Points
    67
    Par défaut seekg, lecture de fichier
    Salut, j'ai un fichier qui contient les données suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    gr1 43
    gr1 12
    gr1 65
    gr4 23
    gr4 54
    gr6 23
    gr6 54
    gr6 23
    gr6 66
    gr6 12
    J'ai besoin de la moyenne des divers groupes(gr1..gr6), la note du cours est à vis-à-vis.

    Donc normallement j'aurais un affichage comme:
    gr1:40
    ...

    Mon problème c'est que je suis incapable de reculer avec seekg, mon programme plante.

  2. #2
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Mon expérience me dit que, généralement, quand on veut utiliser seekg, c'est qu'on est passé à côté de quelque chose. Quand j'imagine le code que j'emploierais pour lire ton fichier, je n'y vois aucun seekg. Peux-tu être plus explicite ?
    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.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Mon expérience me dit que, généralement, quand on veut utiliser seekg, c'est qu'on est passé à côté de quelque chose. Quand j'imagine le code que j'emploierais pour lire ton fichier, je n'y vois aucun seekg. Peux-tu être plus explicite ?
    Eh bien, moi j'ai essayer de faire quelque chose du genre:

    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
     while (!read3.eof()){
    					  read3 >> noGr >> note;
    					  read3.seekg(0, ios::beg+1);
     
    					  read3 >> noGr2 >> note;
    					  //cout<<"( "<<noteCours << " + " <<note2 <<") \n";
    					  cout << noCours << "==" << noCours2<<"\n";
    					  if (noCours == noCours2){
    						  moy+=noteCours+note2;
    					  }else{
    						  moy+=noteCours;
    						  cout << noCours << "Moy: " << moy<<"\n";
    						  moy=note2;
    					  }
    				  }
    Voici ce que j'avais écris, mais bon, cela ne fonctionne pas puisque je compare des pairs(1 et 2, 3 et 4, 5 et 6), et moi j'ai besoin d'une comparaison du genre:1 et 2, 2 et 3, 3 et 4.

    Je ne sais pas comment m'y prendre.(read3 est un ifstream)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Généralement tu devrais éviter d'utiliser eof(); les flux ont une conversion implicite en booléen qui teste non seulement la fin du flux mais aussi son état.
    Après je ne comprend pas ce que vient faire le seekg.Tu veux revenir au debut du fichier?
    Pour ce qui est des pairs, c'est faisable facilement en ne faisant qu'une seul lecture par tour de boucle mais en conservant le nom du groupe précédent dans une autre variable (tu peux aussi utiliser une std::map, mais c'est un peu le bazooka pour tuer une mouche...).
    D'ailleurs, si tu veux faire des moyennes, il te manque une division.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Si ton fichier est trié (au minimum par groupe), peut être as-tu entendu parler d'un principe que l'on appelle les "ruptures", qu'il serait intéressant de mettre en oeuvre

    Le principe est *relativement* simple:

    Lorsque tu lis ton fichier, tu va essayer de repérer ce moment particulier où l'information lue (en cours de traitement) change par rapport à l'information équivalente lue à la ligne précédente.

    Ce moment particulier s'appelle la rupture, car c'est le moment où ce que tu va lire par la suite ne s'applique plus au même groupe de données.

    C'est à ce moment particulier qu'il faudra prendre "toutes les dispositions utiles" afin de clôturer correctement la lecture du groupe de données précédent.

    Par exemple, dans ton cas, on remarque que la première information lue (gr1, gr4, ...) est l'information la plus stable (on lira N fois "gr1" L fois "gr2",...), et que c'est lorsque l'on passe de l'un à l'autre qu'il devient intéressant de "clôturer" la gestion du groupe précédent.

    Cela peut donc se faire très facilement sous la forme de:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    std::string temp = ""; // on garde le nom du groupe précédent, 
                           // par facilité
    int count = 0 ; // le nombre d'informations obtenues dans le groupe en cours
    int lines = 0; // pas indispensable mais peut être utile pour garder 
                   // le nombre de lignes lues
    int total = 0; // le total des notes de chaque groupe
    bool first = true;
    while( read3 )
    {
        ++lines;
        std::string gr;
        double note;
        /* on lit uniquement le nom du groupe */
        read3 >> gr;
        /* si on change de groupe */
        if( gr != temp ) 
        {
            /* si ce n'est pas la première fois qu'on change, on affiche
             * la moyenne du groupe précédent
             */
            if( !first )
            {
                cout<<"moyenne du groupe "<<temp<<" : "<<total/count<<endl;
            }
            /* le groupe lu devient le groupe en cours */
            temp = gr;
            /* on remet les compteurs à zero */
            total = 0;
            count = 0;
            /* et ce ne sera plus jamais la première fois qu'on change de groupe 
             */
            first = false;
        }
        read3 >> note;
        total += note;
     
        /* on peut même faire un petit affichage de toutes les lectures :D */
        cout<<"lecture de la ligne "<<lines<<" :"<<endl
            <<"    goupe : "<<gr<<" valeur : "<<note<<endl;
        count++;
    }
    Simple et efficace
    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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Points : 67
    Points
    67
    Par défaut
    Merci, nous avons passé moins d'une heure à l'étude des traitements de fichiers, cela a ternie mon raisonnement quand je me suis mis à l'oeuvre.

    Je vais étudier ton code, merci encore.

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. [jsp]lecture de fichier
    Par antigone dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 04/09/2003, 11h05
  3. [AS400][Intranet][PC] Lecture de "fichiers" AS400
    Par lando dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 16/07/2003, 11h11
  4. Lecture de fichier
    Par Watcha dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 04/03/2003, 20h43
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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