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 :

[C++11] Correction / Optimisation - Extraction de donnée d'un string


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut [C++11] Correction / Optimisation - Extraction de donnée d'un string
    Bonjour à tous, j'ai créé une petite fonction nommée extractStrInfo qui permet de récupérer une donnée venant d'une chaîne de caractère en renvoyant cette donnée avec le bon type associé. Le problème est que je ne sais pas récupérer ma donnée :/ d’ailleurs je ne sais pas non plus si je m'y prends de la bonne façon, je n'utilise presque jamais les templates.

    Voici tout le code que j'ai fait :

    function.hpp
    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
     
    #ifndef Function_included
    #define Function_included
     
    #include <string>
    #include <sstream>
    #include <vector>
    #include <ctype.h>
    #include <algorithm>
     
    #include "Item.hpp"
     
    namespace xy
    {
        void split( std::string const &s, char delim, std::vector<std::string> &elems );
        template <class T>
        T extractStrInfo( std::string const &str, char delim, unsigned int pos );
        bool isNumber( std::string const &str );
        bool isBool( std::string const &str );
        std::string toLower( std::string const &str );
        std::string toUpper( std::string const &str );
        bool toBool( std::string const &str );
    };
     
    #endif // Function_included
    function.cpp
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    #include "function.hpp"
     
    void xy::split( std::string const &s, char delim, std::vector<std::string> &elems )
    {
        std::stringstream ss;
        ss.str(s);
        std::string str;
        while(std::getline(ss, str, delim))
        {
            elems.push_back(str);
        }
    }
     
    template <class T>
    T xy::extractStrInfo( std::string const &str, char delim, unsigned int pos )
    {
        std::vector<std::string> elems;
        xy::split( str, delim, elems );
        if( pos > elems.size() - 1 )
        {
            throw std::string("[Extractor] Element out of reach " + static_cast<std::string>(pos) + '/' + static_cast<std::string>(elems.size() - 1) + '.');
        }
        else
        {
            if( xy::isNumber(elems[pos]) )
                return std::stoi(elems[pos]);
            else if( xy::isBool(elems[pos]));
                return xy::toBool(elems[pos]);
            return elems[pos];
        }
    }
     
    bool xy::isNumber( std::string const &str )
    {
        for( size_t i{0}; i < str.size(); ++i )
        {
            if(!isdigit(str[i]) && str[i] != '-')
                return false;
        }
        return true;
    }
     
    bool xy::isBool( std::string const &str )
    {
        if( xy::toLower(str) == "true" || xy::toLower(str) == "false" )
            return true;
        return false;
    }
     
    std::string xy::toLower( std::string const &str )
    {
        std::string n{str};
        std::transform(n.begin(), n.end(), n.begin(), tolower);
        return n;
    }
     
    std::string xy::toUpper( std::string const &str )
    {
        std::string n{str};
        std::transform(n.begin(), n.end(), n.begin(), toupper);
        return n;
    }
     
    bool xy::toBool( std::string const &str )
    {
        if( !xy::isBool(str) )
            throw std::string("[ToBool] " + str + " is not convertible.");
        else
        {
            if( xy::toLower(str) == "true" )
                return true;
            return false;
        }
    }
    En faite j'ai une BDD contenant des items, elle ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    645;50;Amulet;Amulette Royale du Bouftou;true;0;0;0;0;30;30;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
    646;50;Amulet;Amuronce;true;40;0;0;-15;20;0;20;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0
    647;50;Amulet;Amublop Reinette;true;40;0;0;15;25;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;5;0;0
    ....
    J'ai une classe Item et je souhaite charger depuis cette BDD toutes ses caractéristiques.
    Bref. En l’occurrence la fonction extract me servira juste pour récupérer des infos pour debug, je ferais une autre fonction presque similaire pour charger directement un Item mais encore faudrait-il que je comprenne comment faire la conversion x).

    Voilà voilà donc si vous pouvez m'expliquer comment faire ce serait sympa ^^". En soit le code fonctionne mais, il ne fait peut-être pas ce que je souhaite réellement ou bien je ne sais juste pas me servir de ce que j'ai créé ( il faut le faire quand même ).

    Je vous remercie de bien vouloir m'aider.
    Disixlis

    Ps : Je ne souhaitais pas utiliser d'api comme mysql connector, car je veux apprendre par moi même et cela fait un bon exercice. || Je ne veux pas d'un bloc de code en guise de solution, par contre un bloc d'explications serait sympa

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Ps : Je ne souhaitais pas utiliser d'api comme mysql connector, car je veux apprendre par moi même
    Apprendre, c'est aussi et surtout utiliser les bons outils.
    Une RegEx est le parsing et fait, pourquoi s'enquiquiner avec tout ce "machin" ?
    Si c'est un fichier CSV, il y a pas mal de subtilités que les classes toutes faites sur le Net gèrent, à toi de voir leur code source pour le comprendre, voir l'amélioré.

    T'as toujours pas compris la citation la plus connu de Newton ?

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut
    Je te remercie pour ta réponse et oui je la connais (du moins si on parle de la même) mais je souhaite savoir comment on fait une tel conversion, c'est pas pour réinventer la roue mais pour comprendre sont fonctionnement , je m'attendais à ce genre de commentaire x). Donc je devrais regardé comment font les outils déjà existant mais j'ai peur qu'il y est énormément de code à décortiquer... pourrais tu me donner un lien vers une lib ultra simpliste pour que je puisse comprendre ? Et en passant, esque pon code est tout de même correct ?

    Ps : je ne connais pas correctement les expressions régulières je vais mieux m'informer

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    J'aime bien les gens qui essayent
    On peut croire tout ce qu'on nous dit, mais c'est bien aussi d'essayer et de se tromper

    Le template <class T> c'est du code pour le compilateur qui doit pouvoir déterminer sans ambigüité ce qu'est T, et toi tu veux dire au compilateur "attends de lire la donnée pour savoir qui est T".
    Or, la donnée est lue lors du runtime, c'est-à-dire quand le compilateur a fini son job et que le programme est en cours d'exécution.
    L'utilisation d'un template n'est donc pas possible dans ce cas-ci.
    A noter que j'aime bien l'idée, celle d'un code qui s'adapte en fonction des données traitées, de l'autoprogrammation en somme.
    Ça viendra un jour peut-être mais le C++ ne le permet pas encore

    Ta fonction extractStrInfo() devrait plutôt retourner un variant, ou une structure contenant une union. Bientôt il y aura un std::variant, en attendant tu peux utiliser boost::variant.

  5. #5
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Ca n'est ni plus ni moins que de la (dé)sérialisation.
    Il ne faut pas partir dans un truc plus compliqué que ça.
    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.

Discussions similaires

  1. [VBA Excel] Extraction de données
    Par tpv72 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/09/2005, 21h49
  2. Extraction de données depuis fichier .NDX ...
    Par Olif_C dans le forum WinDev
    Réponses: 4
    Dernier message: 30/08/2005, 11h57
  3. [debutant] extraction de données
    Par tibpower dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 02/08/2004, 14h33
  4. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

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