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 :

Comptabiliser des mots et detection d'espace dans un texte


Sujet :

C++

  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut Comptabiliser des mots et detection d'espace dans un texte
    Bonjour tous,

    j'ai un fichier texte avec deux type de lignes (pour simplifier) A et B:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    # type A
    A ferrite 2.85 1e-30
     # type B
    B VC 4.1
    je voudrais s�lectionner chaque ligne et mettre dans une variable, pour cela je fais:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    getline(inputfile,variable)
    ensuite je voudrais savoir combien il y a de mot dans la phrase
    pour cela je ne sais pas trop comment faire, j'ai regard� un peu sur diverses FAQ et autre et j'ai l'impression que l'on peut faire quelque chose avec:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    find_first_of()
    size()
    substr (..,..)
    mais je ne sais pas comment faire.

    ==> je pensais faire variable.size() pour avoir le nombre de caracteres et ensuite faire variable.find_first_of() pour detecter le nombre d'espaces mais je ne sais pas comment faire pour detecter des espaces et je n'arrive pas non plus � m'en sortir avec les positions des espaces.

    ensuite je voudrais stocker le nombre de mot de chaque line dans des variables:
    je pense qu'il n'y aura pas de probl�mes si le truc d'avant est r�solu

    J'espere que vous pourrez m'aider....

    merci d'avance

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    Bonjour,
    je viens de regarder sur le net et j'ai trouv� pas mal de fonction pour les string mais pas pour compter le nombre de mots dans un lignes.

    ==> au lieu de faire ce que je cherche � faire peut etre qu'il existe une fonction toute prete capable de faire cela?

  3. #3
    Membre �clair�

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Par d�faut
    Salut, ce que tu cherches � faire s'appelle un split. Tu as plusieurs pistes sur ce lien http://stackoverflow.com/questions/2...split-a-string

  4. #4
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    super! merci d'avoir pris le temps de r�pondre ce lien � l'air pas mal du tout

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    je reviens car j'ai quelques petits soucis de comprehension du programme

    ==> j'ai mis mais commentaires dans le code ci dessous

    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
     
    #include <iostream>  //permet gérer flux
    #include <sstream>   //pour manipuler les string
    #include <string>     //permet gérer objet string
    using namespace std;
     
    int main()
    {
    //on attribut à variable s une chaine de caractere
        string bibi=("Somewhere down the road"); 
    //ISS est un objet de type istringstream il contient le string 
    //bibi
        istringstream iss(bibi);
     
        while (iss)
        {
            string sub;
            iss >> sub;
    //c'est operation je ne la comprend pas on met tout le contenu "bibi"
    //dans la variable sub ?
            cout << "Substring: " << sub << endl;
        }
        return 0;
    }
    Je vous pose cette question car bien que le code fonctionne j'aimerai comprendre comment il "marche".

    De plus j'aimerai connaitre la taille de ISS avant de faire la boucle mais j'ai remarqu� que
    ne fonctionne pas et j'aimerai comprendre pourquoi

    j'ai regard� sur la faq et j'ai vu que istringstream sert � faire des convertion donc je ne comprends pas comment il est utilis� ici pour que ca fonctionne

    merci d'avance pour votre aide

  6. #6
    Membre �clair�

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Par d�faut
    Je te conseille de regarder ce lien http://www.cplusplus.com/reference/iostream/istream/ et notamment la partie sur l'op�rateur <<.

    Tu peux re-coder une fonction split() pour avoir un code plus propre.

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Si tu veux juste compter le nombre de mots qu'il y a dans ta variable, sans pour autant r�cup�rer chacun de ceux-ci, il existe, dans le fichier d'en-t�te <algorithm>, une fonction nomm�e count_if, plac�e, comme tout ce qui vient du standard, dans l'espace de noms std.

    Son prototype est du genre de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    template <typename iter, typename functor>
    count_if(iter begin, iter end, functor func)
    Et, devine quoi son but est de compter le nombre d'�l�ments compris entre begin et en qui renvoient vrai lorsqu'ils sont soumis au foncteur func

    Or, il se fait que, justement, la classe string dispose des fonctions membre begin() et end() qui renvoient respectivement un it�rateur sur le premier caract�re et un autre sur ce qui suit le dernier caract�re

    De plus, il existe une fonction nomm�e isspace qui permet de d�terminer si un caract�re donn� est consid�rable comme un espace (car il n'y a pas que " " qui peut �tre consid�r� comme tel ).

    La solution �l�gante pour compter le nombre de mots pourrait donc parfaitement passer par la cr�ation d'un foncteur qui permet de savoir si un caract�re donn� est un espace, qui prendrait la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    struct isSpace
    {
        bool operator()(char const c) const
        {
            return std::isspace(c);
        }
    };
    et de l'utiliser dans la fameuse fonction count_if, sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    int main()
    {
        std::string str("A ferrite 2.85 1e-30");
        std::cout<<std::count_if(str.begin(),str.end(),isSpace())+1;
    }
    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

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    merci pour votre aide mon probleme est r�solu avec la premiere m�thode

    (je vais surement j'etais un coup d'oeil sur la 2eme car elle a l'air tres bien aussi)

    A bientot et encore merci

  9. #9
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par 21did21 Voir le message
    je reviens car j'ai quelques petits soucis de comprehension du programme

    ==> j'ai mis mais commentaires dans le code ci dessous

    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
     
    #include <iostream>  //permet gérer flux
    #include <sstream>   //pour manipuler les string
    #include <string>     //permet gérer objet string
    using namespace std;
     
    int main()
    {
    //on attribut à variable s une chaine de caractere
        string bibi=("Somewhere down the road"); 
    //ISS est un objet de type istringstream il contient le string 
    //bibi
        istringstream iss(bibi);
     
        while (iss)
        {
            string sub;
            iss >> sub;
    //c'est operation je ne la comprend pas on met tout le contenu "bibi"
    //dans la variable sub ?
            cout << "Substring: " << sub << endl;
        }
        return 0;
    }
    Je vous pose cette question car bien que le code fonctionne j'aimerai comprendre comment il "marche".
    Le fait est que les op�rateurs << et >> s'arr�tent au premier caract�re pouvant passer pour un espace.

    L'espace (ou tout caract�re pouvant passer pour) est en effet le caract�re qui sert "classiquement" pour s�parer les informations .

    Or, l'id�e est que chaque valeur � convertir sera, fatalement s�par�e des autres, et que le caract�re id�al pour ce faire est... l'espace (ou tout autre caract�re pouvant passer pour).

    il est donc normal que l'op�rateur >> s'arr�te au premier espace qu'il rencontre, pour �viter de traiter deux valeurs diff�rentes comme s'il s'agissait d'une seule, et qu'il supprime l'espace rencontr� et tous ceux qui pourraient suivre, de mani�re � ce que la prochaine utilisation de l'op�rateur >> donne le r�sultat attendu
    De plus j'aimerai connaitre la taille de ISS avant de faire la boucle mais j'ai remarqu� que
    ne fonctionne pas et j'aimerai comprendre pourquoi
    Parce que tu n'as, simplement, pas besoin de connaitre la taille...

    En effet, on pourrait parfaitement envisager une situation dans laquelle ton istringstream est rempli d'un cot� (un thread qui envoie des informations, par exemple) et vid� par un autre (un deuxi�me thread qui converti les informations que le premier a envoy� dedans).

    De plus, la taille que tu obtiendrais serait la taille totale du flux, incluant tous les caract�res utiles � la conversion mais n'intervenant pas dans la valeur convertie(espace, tabulation, retour � la ligne, ...)

    Or, ce n'est, tr�s certainement pas ce genre d'information que tu esp�re obtenir en en demandant la taille

    C'est la raison pour laquelle on ne travaille jamais avec une boucle se basant sur la taille du flux, mais bien avec une boucle dans laquelle on entre uniquement si le flux est valide

    Si la conversion des donn�es �tait d�volue � un thread particulier, nous pourrions parfaitement envisager de travailler avec deux boucles imbriqu�es sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void foo(stringstream & ss)
    {
        while (thread_not_dead) tant que le thread est actif
        {
            while(ss) // tant qu'il y a quelque chose à récupérer
            {
                // on récupère ce que l'on doit
            }
            /* et on attend qu'un autre thread remplice de nouveau le flux
        }
    }
    (bon, d'accord, il faudrait sans doute prendre quelques pr�cautions suppl�mentaires
    j'ai regard� sur la faq et j'ai vu que istringstream sert � faire des convertion donc je ne comprends pas comment il est utilis� ici pour que ca fonctionne

    merci d'avance pour votre aide
    istringstream est ce que l'on appelle un "flux", comme l'indique le stream � la fin de son nom

    C'est � dire que c'est une classe qui est pr�te � recevoir "en permanence" des donn�es destin�es � un usage � d�terminer.

    L'autre partie du nom t'indique qu'il traite des chaines de caract�res (string) entrantes (i pour In), et sous entend donc que l'on ne sait, a priori, pas ce qu'il y aura en sortie (car les flux on syst�matiquement une entr�e et une sortie... autrement, ils ne pourraient pas suivre leur cours )

    Si l'on met le tout ensemble, on se rend compte qu'il s'agit d'un flux de conversion permettant de convertir une chaine de caract�res en... � peu pr�s n'importe quoi.

    La seule contrainte qu'il impose, c'est que l'op�rateur >> soit d�fini pour le type dans lequel on souhaite convertir la chaine de caract�res.

    A la base, cet op�rateur est d�fini pour les types primitifs (caract�res, entiers et r�els) et pour certains types "d�finis par l'utilisateur" (par la norme, en r�alit�) comme... les chaines de caract�res.

    Cela peut paraitre paradoxal, mais il faut bien comprendre que la chaine de caract�res est un type de donn�es r�guli�rement utilis� dans des structures plus complexes.

    Nous pourrions ainsi avoir une structure produit proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    struct Produit
    {
        std::string nom;
        double prix_de_vente;
        double prix_d_achat;
        std::string fournisseur;
    };
    et nous voudrions donc pouvoir sauvegarder, et surtout r�cup�rer par la suite, le nom du produit, le fournisseur et les prix de vente et d'achat

    Si l'on r�cup�re les informations permettant de donner les valeurs ad�quates � cette structure sous la forme d'une chaine de caract�res, ce sera sans doute sous une forme proche de
    et nous en arriverons donc � les r�cup�rer grace � un code proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    std::istringstream iss(chaine_lue); // on place la ligne lue dans le flux;
    produit prod; // on crée un produit "non initialisé"
    iss>>prod.nom // on récupère le nom (qui est une chaine de caractère)
       >>prod.prix_de_vente // le prix de vente
       >>prod.prix_d_achat // le prix d'achat
       >>prod.fournisseur; // et le fournisseur
    Et tu pourrais donc red�finir l'op�rateur >> de mani�re � ce qu'il agisse de la sorte pour un produit, sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    istringstream & operator(istringstream & iss, produit & prod)
    {
    iss>>prod.nom // on récupère le nom (qui est une chaine de caractère)
       >>prod.prix_de_vente // le prix de vente
       >>prod.prix_d_achat // le prix d'achat
       >>prod.fournisseur; // et le fournisseur
       return iss;
    }
    qui te permettrait, si tu veux r�cup�rer les informations � plusieurs endroits, d'�crire simplement iss>>prod au lieu de devoir copier encore et toujours le m�me code de quatre lignes

    Maintenant, si ta question est de savoir comment on arrive � convertir une chaine de caract�res en un type primitif, la r�ponse que je te ferai ne va sans doute pas te satisfaire: il n'est pas utile, dans un premier temps, en tout cas, de t'interroger sur le sujet. Sache simplement que istringstream fait parfaitement cela et profites-en quand tu en as besoin
    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

  10. #10
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    merci Koala pour ce cours

    Citation Envoy� par koala01 Voir le message
    Le fait est que les op�rateurs << et >> s'arr�tent au premier caract�re pouvant passer pour un espace.
    L'espace (ou tout caract�re pouvant passer pour) est en effet le caract�re qui sert "classiquement" pour s�parer les informations .
    Or, l'id�e est que chaque valeur � convertir sera, fatalement s�par�e des autres, et que le caract�re id�al pour ce faire est... l'espace (ou tout autre caract�re pouvant passer pour).
    il est donc normal que l'op�rateur >> s'arr�te au premier espace qu'il rencontre, pour �viter de traiter deux valeurs diff�rentes comme s'il s'agissait d'une seule, et qu'il supprime l'espace rencontr� et tous ceux qui pourraient suivre, de mani�re � ce que la prochaine utilisation de l'op�rateur >> donne le r�sultat attendu
    d'accord j'ai bien saisi � pr�sent

    Citation Envoy� par koala01 Voir le message
    Parce que tu n'as, simplement, pas besoin de connaitre la taille...
    En effet, on pourrait parfaitement envisager une situation dans laquelle ton istringstream est rempli d'un cot� (un thread qui envoie des informations, par exemple) et vid� par un autre (un deuxi�me thread qui converti les informations que le premier a envoy� dedans).
    De plus, la taille que tu obtiendrais serait la taille totale du flux, incluant tous les caract�res utiles � la conversion mais n'intervenant pas dans la valeur convertie(espace, tabulation, retour � la ligne, ...)
    Or, ce n'est, tr�s certainement pas ce genre d'information que tu esp�re obtenir en en demandant la taille
    C'est la raison pour laquelle on ne travaille jamais avec une boucle se basant sur la taille du flux, mais bien avec une boucle dans laquelle on entre uniquement si le flux est valide
    en fait je pense que ca aurait �t� utile une fonction qui donne le nombre de "mot" s�par� par un espace ou autre caractere de separation.

    c'est ce type de fonction que je croyais qu'il existait, ca eviterai de faire une boucle comme j'ai pu faire.

    Citation Envoy� par koala01 Voir le message
    C'est � dire que c'est une classe qui est pr�te � recevoir "en permanence" des donn�es destin�es � un usage � d�terminer.
    L'autre partie du nom t'indique qu'il traite des chaines de caract�res (string) entrantes (i pour In), et sous entend donc que l'on ne sait, a priori, pas ce qu'il y aura en sortie (car les flux on syst�matiquement une entr�e et une sortie... autrement, ils ne pourraient pas suivre leur cours )
    Si l'on met le tout ensemble, on se rend compte qu'il s'agit d'un flux de conversion permettant de convertir une chaine de caract�res en... � peu pr�s n'importe quoi.
    La seule contrainte qu'il impose, c'est que l'op�rateur >> soit d�fini pour le type dans lequel on souhaite convertir la chaine de caract�res.
    A la base, cet op�rateur est d�fini pour les types primitifs (caract�res, entiers et r�els) et pour certains types "d�finis par l'utilisateur" (par la norme, en r�alit�) comme... les chaines de caract�res.
    OK pour toutes ces infos complementaires,

    j'ai bien saisi � pr�sent et je t'en remercie

  11. #11
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    Par d�faut
    Il y a une fa�on STLienne de d�couper les chaines dans la zone source de dvpz.
    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...

  12. #12
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    Je ne connais pas la STL (je suis grand d�butant), je conserve donc la m�thode que j'ai cit� ci dessus

    merci quand meme

  13. #13
    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 : 51
    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
    Par d�faut
    Je te conseille de lire http://www.developpez.net/forums/d10...s/#post5631661
    J'y donne un code complet pour d�couper une cha�ne selon une expression r�guli�re.
    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.

  14. #14
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    Je te conseille de lire http://www.developpez.net/forums/d10...s/#post5631661
    J'y donne un code complet pour d�couper une cha�ne selon une expression r�guli�re.
    merci

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. r�cup�rer des mots s�par�s par un espace dans une ligne
    Par laurentze dans le forum Shell et commandes GNU
    R�ponses: 2
    Dernier message: 14/06/2010, 16h04
  2. R�ponses: 1
    Dernier message: 15/04/2009, 18h28
  3. [RegEx] D�tecter des mots s�par�s par diff�rents espaces
    Par lorange dans le forum Langage
    R�ponses: 4
    Dernier message: 03/03/2009, 21h20
  4. R�ponses: 2
    Dernier message: 28/05/2008, 22h13
  5. enlever des espaces dans un texte
    Par juin29 dans le forum Langage SQL
    R�ponses: 6
    Dernier message: 22/03/2007, 15h45

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