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 :

lire un texte mot par mot


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut lire un texte mot par mot
    Bonjour à tous,
    Je cherche à écrire une fonction me permettant de lire un fichier mot par mot. J'ai déjà le code me permettant de lire un fichier ligne par ligne mais je ne trouve pas d'info pour lire mot par mot.
    Voici le code dont je dispose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        std::ifstream fichier( "staff.txt" );
        if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
        {
    	string ligne; // variable contenant chaque ligne lue
    	cout<<i;
    	i++;
            while ( std::getline( fichier, ligne ) )
            {
               std::cout << ligne << std::endl;
            }
        }
    Pourriez-vous me donner une piste pour arriver à ce que je veux?

    Je souhaite écrire cette fonction car je compte m'en servir pour ensuite trouver un mot dans un texte en utilisant strcpm(mon mot,chaque mot du texte). Est-ce réalisable en faisant comme ça ou dois-je chercher complètement autre chose?

    Merci pour vos idées

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 142
    Points : 154
    Points
    154
    Par défaut
    Bonsoir,

    En supposant qu'entre chaque mot il y ai un espace, il suffit de rajouter un paramètre a std::getline();

    Il s'agit du delimiteur qui, s'il n'est pas spécifier lors de l'appel de la fonction est par défaut '\n'. D'ou ta lecture ligne par ligne.

    donc utilise std::getline comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::getline( fichier, ligne , " " );

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Ok, merci.
    Maintenant, j'essaie d'écrire la fonction qui cherche l'occurence d'un nom dans un fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void stafflist::SearchStaffIdentification(){
    string u;
     std::ifstream fich( "staff.txt" );
     
    if ( fich ) 
    	{
    	string ligne; 
        	while ( u=std::getline( fich, ligne, ' ' )) {        	
                	if (strcmp("Dupont",u) == 0)
               	cout << "yes";
            	}
    	}
    }
    Mais j'obtiens :
    erreur: cannot convert ‘std::string’ to ‘const char*’ for argument ‘2’ to ‘int strcmp(const char*, const char*)’
    Je pense que ma façon de stocker les mots au fur et à mesure : u=std::getline( fich, ligne, ' ' ) ne va pas et je ne trouve pas d'info sur la manière de comparer un mot avec une variable. Est ce que strcmp("Dupont",u) est juste?
    Encore une fois, j'en appelle vos lumières

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Quelle est ta définition de "mot" ?
    S'il s'agit de vrais mots, faut sortir l'artillerie lourde : Unicode a un algorithme pour ça. (attention, pour le thailandais, il faut un dictionnaire)
    Boost ftw

  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,

    C'est normal, la classe std::string n'est pas une chaine de caractères "C style" (ce n'est pas un tableau de caractères terminé par '\0', même si la classe std::string contient quelque chose de similaire )

    On ne peut donc pas utiliser strcmp pour comparer deux std::string (ou assimilable à).

    Par contre, l'opérateur d'égalité (au même titre que tous les opérateurs de comparaion, d'ailleurs) est défini pour cette classe.

    En outre, tu ne semble pas vraiment avoir compris le principe de std::getline...

    Lorsque tu écris le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::getline(fichier, chaine /*, séparateur */)
    tu demande de placer dans... chaine la suite du contenu de fichier jusqu'au séparateur éventuellement donné.

    Pour comparer vérifier si une chaine lue dans le fichier, tu dois donc tester l'égalité entre... la chaine lue et... la chaine de référence

    Cela donnerait donc un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::getline(fichier, chaine /*, separateur */);
    if(chaine=="Dupont")
    {
        /* ce qui doit etre fait */
    }
    Ceci dit, si tu sais que tu n'aura de toutes manière que des chaines à récupérer, tu peux envisager un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(fichier>> chaine)
    {
        if(chaine == "Dupont")
        {
            /*...*/
        }
    }
    En effet, traditionnellement, la fonction getline est destinée à prendre d'un seul coup tout ce qui se trouve avant le retour à la ligne suivant (ou assimilé), le plus souvent de manière à être en mesure de "parser" cette chaine
    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 régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Merci bcp, ça marche bien maintenant
    Je mets le code, si ça peut aider quelqu'un

    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
     
    if ( fich ) 
    {
       while ( (fich>>chaine) && (chaine != "Dupond") ) 
       {
     
       }
     
       if(chaine=="Dupond")
       {
          cout<<chaine;
          cout << "The staff  is in the list\n";
       }
       else
          cout<<"The staff  is not in the list\n";
       }
    }
    Ah, dernière chose, j'ai rien à mettre dans ma boucle while, à priori ça ne me met pas d'erreurs, mais ça ne peut pas causer des problèmes?

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Si tu avais indenté ton code correctement, tu verrais qu'il y a une accolade fermante de trop.

    Telle qu'elle est faite, ta boucle while semble être une boucle sans fin, je ne comprend pas trop la condition de sortie
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    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
    Citation Envoyé par ram-0000 Voir le message
    Si tu avais indenté ton code correctement, tu verrais qu'il y a une accolade fermante de trop.
    oui, mais...
    Citation Envoyé par ram-0000 Voir le message
    Telle qu'elle est faite, ta boucle while semble être une boucle sans fin, je ne comprend pas trop la condition de sortie
    On boucle:
    • tant qu'on peut lire quelque chose dans le fichier ET
    • tant que ce que l'on a lu n'est pas égal à Dupont



    Comme Jane40 a utilisé l'opérateur ET optimisé, la deuxième condition n'est vérifiée que si la première est évaluée à vrai (que la lecture a fonctionné )
    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

  9. #9
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ben oui mais alors pourquoi un if() qui re-teste la condition déjà testé pour sortir du while?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  10. #10
    Membre éclairé

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Le if() est là pour savoir laquelle des deux conditions du while() a échoué.

    Décidément, pour une fois qu'on a un code correct...

    La seule chose, si on veut pinailler, se serait de rajouter une gestion d'erreur :
    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 ( (fich>>chaine) && (chaine != "Dupond") ) 
    {
    }
     
    if (!fich && !fich.eof())
    {
       cerr << "Reading error!\n";
    }
    else if(chaine=="Dupond")
    {
       cout<<chaine;
       cout << "The staff  is in the list\n";
    }
    else
       cout<<"The staff  is not in the list\n";

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Toute mes confuses... on devrait jamais posté a jeun ... toutes mes excuses au posteur original.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    OK, je comprend mieux alors la condition de sortie, je ne l'avais pas lu comme cela, en fait, je n'avais pas compris que fich était un objet "fichier"
    comme quoi un commentaire bien placé vaut 10 explications
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par Goten Voir le message
    Toute mes confuses... on devrait jamais posté a jeun ... toutes mes excuses au posteur original.
    pas de souci
    Merci a tous pour votre aide

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/05/2011, 04h34
  2. Réponses: 2
    Dernier message: 05/05/2010, 17h01
  3. Lire un fichier texte mot par mot
    Par xspray dans le forum Débuter
    Réponses: 4
    Dernier message: 01/06/2009, 17h34
  4. Lire le contenu d'un fichier mot par mot
    Par mlaiti dans le forum Débuter
    Réponses: 6
    Dernier message: 19/03/2008, 11h15
  5. Lire le contenu d'un champ mot par mot
    Par mlaiti dans le forum SQL
    Réponses: 4
    Dernier message: 17/03/2008, 11h49

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