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

Boost C++ Discussion :

[Boost.Tokenizer] Utiliser le caractère de séparation NULL


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut [Boost.Tokenizer] Utiliser le caractère de séparation NULL
    Bonjour,

    Durant mon projet, j'aurais besoin de séparer une multistring (tableau de char, instauré par Microsoft, représentant plusieurs chaînes de caractères séparées par un caractère NULL, selon : "String1\0String2\0String3\00" [deux caractères NULL finaux]) en plusieurs strings. J'ai donc pensé à boost::tokenizer, mais en faisant le test suivant :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //#define MAX_PATH 260
     
    char temp[MAX_PATH] = "YOUHOU;\0SALUT\0TOP";
     
    boost::tokenizer<boost::char_separator<char> > tok(std::string(temp), boost::char_separator<char>("\0"));
    for (boost::tokenizer<boost::char_separator<char> >::const_iterator i = tok.begin(); i != tok.end(); ++i )
        MessageBox(hwnd, i->c_str(), "Test", MB_ICONINFORMATION);
    Je n'ai que la première string, ce qui paraît logique du fait que le caractère NULL finit en principe les strings.

    Seulement voilà, je dois faire cette séparation, et j'aimerais vraiment utiliser Boost.Tokenizer pour cela (j'aurais aussi l'alternative STL avec des istream_iterator<>, mais je risque d'avoir le même problème) ; par conséquent, sauriez-vous comment remédier à ce problème (une astuce quelconque) ?

    Merci d'avance.

  2. #2
    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,

    Et pourquoi n'utiliserais tu, tout simplement, pas un simple vecteur de chaines tant que tu n'a pas réellement besoin du multistring

    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
     
    std::vector<std::string> tab;
    tab.push_back("chaine 1");
    tab.push_back("chaine 2");
    /*....*/
     
    et une fonction qui irait bien avec:
    std::string AllInOne( const std::vector<std::string>& tab)
    {
        std::string ret=""
        for(size_t i=0;i<tab.size();i++)
        {
            ret+=tab[i];
            /*éventuellement */
            if(i!=tab.size()-1)
                ret+="caractere de separation";
        }
        return ret;
    }
    D'un autre coté, si le but est de séparer une chaine en plusieurs selon un séparateur donné, rien ne t'oblige à utiliser une multistring...
    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

  3. #3
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    rien ne t'oblige à utiliser une multistring...
    Si, l'API Windows elle-même... GetOpenFileName() permet d'afficher une boîte de dialogue de sélection de fichiers à ouvrir, dont les chemins constituent au retour la multi-string.

    Aucun moyen ?

  4. #4
    Membre éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Up

  5. #5
    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
    Mais, alors, et ce n'est finalement qu'une question (étant pour le moins allergique à l'API windows...), es-tu sur qu'il n'existe aucune méthode dans la multistring qui permette d'obtenir les chaines de manière séparées

    Il me semblerait quelque peu idiot, meme venant de microsoft, qu'ils n'aient pas prévu un moyen pour le faire...

    Je ne sais pas, moi, peut etre, tout simplement l'opérateur []

    Cela *pourrait* donner un truc du genre 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
     
    /* considérons que ms soit une variable de type multistring ;) */
    std::string s1=ms[0];
    std::string s2=ms[1];
    /*...*/
    /* Voir, peut etre encore mieux: récupérer simplement les chaines dans un
     * tableau (en adaptant à la fonction qui permet de récupérer le nombre de
     * chaines dans la multistring (j'ai mis ici size(), mais c'est peut etre autre
     * chose ;) ) ) */
    std::vector<std::string> tab;
    for(size_t i=0;i<ms.size();i++)
    {
        tab.push_back(ms[i]);
    }
    La =>doc msdn<= semble parler d'une fonction qui devrait déjà te permettre d'avancer un peu: ToString

    A partir de là, tu devrais pouvoir envisager de travailler plus sereinement
    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 éclairé Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Par défaut
    Ils fournissent le format, à nous de coder une fonction (ou alors je ne connais pas celle fournie) permettant d'extraire les chaines.

    J'en ai une pareille, en C, mais j'aurais aimé simplifier au maxi le code source en introduisant le plus possible de concepts apportés par Boost (ou la STL, GLib etc.). Après, si ce n'est pas possible, tant pis, mais j'aurais aimé...

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

Discussions similaires

  1. [MySQL] Utilisation de la valeur SQL NULL
    Par pierre50 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 17/03/2006, 14h22
  2. [MySQL] Utilisation du caractère "`" dans les requêtes
    Par PeZ dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/03/2006, 16h01
  3. [BOOST]Comment utiliser la lib boost.python
    Par Invité dans le forum Bibliothèques
    Réponses: 6
    Dernier message: 30/01/2006, 11h35
  4. [XML]caractère de séparation des contenus des éléments
    Par ep31 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 13/12/2005, 11h07
  5. [C#] Caractère de séparation
    Par borgfabr dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/03/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