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 :

probleme fichier lecture


Sujet :

C++

  1. #1
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut probleme fichier lecture
    bonjour

    tout d'abord voici le code

    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
    ifstream ifs(filename);
        int ligne = 0;
        while(!ifs.eof())
        {
            char c = ifs.get();
            if(c == '\n')
            {
                ligne++;
            }
        }
        //cout << "ligne " << ligne << endl;
     
        srand(time(NULL));
        int lignechoisi  = 0;
        while(lignechoisi == 0)
        {
            lignechoisi = rand() % ligne;
        }
        cout << "ligne choisi " << lignechoisi << endl;
     
        ifs.seekg(0, ios::beg);
        int pos = ifs.tellg();
        cout << "position " << pos << endl;
        //lignechoisi--;
        while(lignechoisi > 0)
        {
            //cout << "entrer 2eme boucle" << endl;
            char c = ifs.get();
            cout << c << endl;
            if(c == '\n')
            {
                cout << c << " trouver" << endl;
                lignechoisi--;
                cout << "ligne " << lignechoisi << endl;
            }
        }
    alors voila tout marche jusqu'a la deuxieme boucle ou il doit se placer a la ligne choisi il ne lis pas de caratere donc boucle infinie.

    donc la question est pourquoi il fait cela ?

    ps : je suis presque sur de mon code car deja utiliser une fois pour un jeu de mot mystere qui fonctionne encore

  2. #2
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    plutôt qu'entrer tes caractères les un après les autres utilise un "getline"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            std::string name;
            int line(0);
            while( std::getline(ifs,name))
                    ligne++;
    Tu parles de deuxième boucle, la ligne 15 ?

  3. #3
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Pour le getline a voir.

    non 3ème boucle ligne 25 désolé

  4. #4
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Pour le getline c'est mile fois(au moins) plus facile !
    (Je ne te vois à aucun moment où tu stockes un nom, un char stocke UNE lettre. Utilise les strings !! (tu peux jouer avec les mots sans te préoccuper de savoir comment sont gérées chaque lettre )
    Un exemple pour te rendre compte de l’efficacité du getline et string :
    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
    #include <vector>
    #include <string>
    #include <iostream>
    #include <fstream>
    #include  <stdlib.h>
    using namespace std;
     
    int main(void) {
     
            vector < string > dico;
            ifstream ifs( "Dico.txt" );
            string nom;
     
            while( getline( ifs, nom ))//Tant qu'il y a des lignes
                    dico.push_back( nom );//Stocke les strings dans un vecteur
     
            cout << "Taille du dico :" << dico.size() << endl;
     
            srand( time( NULL ));
            int lignechoisi = rand() % dico.size() + 1;
     
            cout << "Ligne choisi :" << lignechoisi << endl;
     
            cout << "Mot choisi : " << dico[ lignechoisi - 1 ] << endl;
     
            return 0;
    }

  5. #5
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Ouais mais dans mon cas je sais pas si cela servirait car je veux compter le nombre de ligne puis générer un nombre aléatoire de ces lignes qui sera la ligne choisi pour enfin parcourir jusqu’à se placer à la ligne.

  6. #6
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    je veut compter le nombre de ligne puis generer un nombre aleatoire de ces lignes qui sera la ligne choisi pour enfin parcourir jusqu'a se placer a la ligne
    , et recuperer le mot ?! Le code que je t'ai donné fait tout cela :

    Nombre de lignesChoix aléatoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    srand( time( NULL ));
            int lignechoisi = rand() % dico.size() + 1;
    Récupération du mot à "lignechoisi"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico[ lignechoisi - 1 ]

  7. #7
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Sauf que dans mon cas mon fichier contient tout un tas d'information par ligne donc je me vois pas jouer avec le string pour couper en plusieurs string ou autres

  8. #8
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    sauf que dans mon cas mon fichier contient tout un tas d'information par ligne donc je me vois pas jouer avec le string pour couper en plusieurs string ou autres
    Ok
    C'est sans doute pas le meilleur mais ferme la lecture de ton fstream puis ouvre en un second :
    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
    ifstream ifs(filename);
        int ligne = 0;
        while(!ifs.eof())
        {
            char c = ifs.get();
            if(c == '\n')
            {
                ligne++;
            }
        }
        ifs.close();
        //cout << "ligne " << ligne << endl;
     
        srand(time(NULL));
        int lignechoisi  = 0;
        while(lignechoisi == 0)
        {
            lignechoisi = rand() % ligne;
        }
        cout << "ligne choisi " << lignechoisi << endl;
     
    ifstream ifs2(filename);//Créer un 2eme stream
     
        int pos = ifs2.tellg();
        cout << "position " << pos << endl;
        //lignechoisi--;
        while(lignechoisi > 0)
        {
            //cout << "entrer 2eme boucle" << endl;
            char c = ifs2.get();
            cout << c << endl;
            if(c == '\n')
            {
                cout << c << " trouver" << endl;
                lignechoisi--;
                cout << "ligne " << lignechoisi << endl;
            }
        }

  9. #9
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    non c'est bon c'est regler c'est juste le seekg qui placer mal donc j'ai remplacer par des ifs.close() puis ifs.open(filename) et voila le tour est jouer il se remet au debut et charge bien.

    parcontre pour le rand() n'y a t'il pas moyen de generer aleatoirement un nombre sans que celui ci tombe presque a coup sur plusieur fois sur le meme d'affiler car pour ce que je veut faire ( chargement de monstre ) c'est bien d'avoir 2 ou 3 monstre pareil mais c'est mieu d'avoir plusieurs differents. je sais se que vous allai me dire faire en sorte de gerer les doublons mais je ne peut car on peu avoir des doublons.

    donc y aurai t'il d'autres moyens de generer aléatoirement mieux que le rand() ?

  10. #10
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par devdeb91 Voir le message
    sauf que dans mon cas mon fichier contient tout un tas d'information par ligne donc je me vois pas jouer avec le string pour couper en plusieurs string ou autres
    Et tu crois qu'il est plus simple de lire le fichier par caractère pour découper sa ligne ?
    Alors que std::string fournit un panel de méthodes qui permettent de maîtriser ça.

    Cela dit, le seekg n'a pas l'air faux pourtant.
    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.

  11. #11
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Et il ne l'est pas mais pourtant avec un seekg cela bug avec un close puis open cela passe sans problème allez savoir pourquoi

  12. #12
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    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é : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par devdeb91 Voir le message
    et il ne l'est pas mais pourtant avec un seekg cela bug avec un close puis open cela passe sans probleme aller savoir pourquoi
    Parce que seekg() ne modifie pas l'état du flux, qui est en erreur puisque tu est allé jusqu'à eof(). Du coup, toute lecture subséquente est impossible. Ce n'est pas le seekg() le problème, c'est la lecture

    Un petit ifs.clear() avant le seekg() et hop, ça devrait marcher comme sur des roulettes
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  13. #13
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Parce que seekg() ne modifie pas l'état du flux, qui est en erreur puisque tu est allé jusqu'à eof(). Du coup, toute lecture subséquente est impossible. Ce n'est pas le seekg() le problème, c'est la lecture

    Un petit ifs.clear() avant le seekg() et hop, ça devrait marcher comme sur des roulettes
    bravo c'est exactement sa

  14. #14
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Citation Envoyé par devdeb91 Voir le message
    pour le rand() n'y a t'il pas moyen de generer aleatoirement un nombre sans que celui ci tombe presque a coup sur plusieur fois sur le meme d'affiler car pour ce que je veut faire ( chargement de monstre ) c'est bien d'avoir 2 ou 3 monstre pareil mais c'est mieu d'avoir plusieurs differents. je sais se que vous allai me dire faire en sorte de gerer les doublons mais je ne peut car on peu avoir des doublons.
    y aurai t'il d'autres moyens de generer aléatoirement mieux que le rand() ?

  15. #15
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il y a boost.random et son jumeau std::<random>, ce dernier n'étant disponible qu'en C++11

  16. #16
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Citation Envoyé par leternel Voir le message
    Il y a boost.random et son jumeau std::<random>, ce dernier n'étant disponible qu'en C++11
    pourriez vous me donner quelque exemple basic car malgrés les recherches et tout le reste ces deux proposition reste trés flou mais vraiment flou je n'y comprend quasiment rien

  17. #17
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Oui: lis la documentation disponible chez boost.
    C'est assez clair, normalement.

  18. #18
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Pour boost que dois je prendre sachant que je suis sur code blocks sous windows ?

  19. #19
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Tu as le choix entre windows et unix donc tu prends windows.

  20. #20
    Membre éclairé Avatar de devdeb91
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 246
    Par défaut
    Oui mais d’après ce que je sais code blocks et un utilitaire linux qui utilise des composant linux

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Gros probleme de lecture d'un fichier texte
    Par Draekonyss dans le forum C
    Réponses: 12
    Dernier message: 25/04/2006, 09h25
  2. Probleme de lecture fichier
    Par calimero642 dans le forum Langage
    Réponses: 4
    Dernier message: 28/03/2006, 10h38
  3. Probleme de lecture de fichier
    Par ArkAng3 dans le forum MFC
    Réponses: 9
    Dernier message: 11/12/2005, 20h47
  4. Probleme de lecture d'un fichier XML
    Par chleuh dans le forum Langage
    Réponses: 8
    Dernier message: 30/08/2005, 12h04
  5. [vb.net][xml] probleme de lecture de fichier
    Par graphicsxp dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/07/2005, 11h51

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