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 :

problème avec boost::split


Sujet :

Boost C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut problème avec boost::split
    Bonjour,

    J'utilise boost::split pour récupérer des informations à partir d'une chaîne de caractères. Cette chaîne de caractères suit la structure suivante :

    J'effectue le traitement de cette chaîne dans la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void traiteChaine(std::string str_chaine) {
    	std::cout << "Chaine reçue " << str_chaine << std::endl;
    	// traitement de la chaine reçue
    	//vecteur des sous chaines reçues
    	std::vector<std::string> strs;
    	//création de la chaîne de délimiteurs
    	char tabDelim[2] = {'_', '|'};
    	std::string delim = tabDelim;
    	boost::split(strs, str_chaine,boost::is_any_of(delim));
    	for(int i = 0 ; i < strs.size()-1; i++)
    		std::cout << " item " << strs[i] << std::endl;
    }
    Pourtant, en fonction des exécutions de mon programme, quelques fois, j'ai le résultat voulu : un affichage du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Chaine reçue 7_1|
     item 7
     item 1
    Mais quelques fois, le split ne se passe pas bien, et j'ai l'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Chaine reçue 7_1|
     item 7
     item 
     item
    Y aurait-il un rapport entre cette erreur et le "ç" de reçu qui s'affiche différemment dans ces deux exécutions ? Ou serait ce un problème dû à boost::split ?

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Je ne suis pas expert mais peut être des histoires de locales et de gestion des caractères accentués par boost::split et std:w)string.

    Esssaye avec un 'c' normal à la place.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Bizarre ton truc...

    Mais ce code me laisse perplexe:
    Citation Envoyé par K-you Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char tabDelim[2] = {'_', '|'};
    	std::string delim = tabDelim;
    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char tabDelim[2] = {'_', '|'};
    	std::string delim(tabDelim, 2);

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    boost::split(strs, str_chaine, boost::is_any_of("_|"));

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    Je ne peux pas faire comme Arza étant donné que mes séparateurs sont stockés dans des variables char. Par contre la méthode de camboui fonctionne.

    Merci

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par camboui Voir le message
    Bizarre ton truc...

    Mais ce code me laisse perplexe:
    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	char tabDelim[2] = {'_', '|'};
    	std::string delim(tabDelim, 2);
    std::string a bien un constructeur depuis une chaine C valide, c'est-à-dire qui se termine par \O....
    Ce code fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tabDelim[3] = {'_', '|', '\0'};
    std::string delim = tabDelim;

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    Je crois que les deux marchent. Il y a une façon meilleure qu'une autre ?

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Un des constructeur de std::string est défini comme ceci (je simplifie quand même)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string(char const *s, size_t l=strlen(s));
    Mon code et celui de poukill font en fait appel au même constructeur. Le mien est un chouïa plus performant car il évite l'appel à strlen(). Dans les deux cas il faut soit connaitre la longueur de la chaine et le preciser dans le constructeur (si on la connait il vaut toujours mieux faire ce choix), soit s'assurer quelle est terminée par un '\0'.
    Dans ton cas, conceptuellement tu sembles utiliser un "tableau de caractères" et non pas une "chaine de caractères". Il n'y a pas de '\0' implicite dans un tableau.

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

Discussions similaires

  1. Problème avec Boost::Graph random_graph_layout
    Par Kiroxas dans le forum Boost
    Réponses: 0
    Dernier message: 13/10/2012, 19h35
  2. Réponses: 19
    Dernier message: 16/09/2008, 11h44
  3. Réponses: 3
    Dernier message: 29/07/2008, 20h03
  4. [boost] Problème avec boost::function
    Par Bakura dans le forum Boost
    Réponses: 3
    Dernier message: 22/03/2007, 20h08
  5. Problème pour utiliser split avec "\"
    Par Nicolas_555 dans le forum Langage
    Réponses: 6
    Dernier message: 03/08/2006, 14h42

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