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

Langage C++ Discussion :

Récupérer des nombres à partir d'une chaîne de caractères


Sujet :

Langage C++

  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut Récupérer des nombres à partir d'une chaîne de caractères
    Bonjour,
    je ne suis pas encore familière du c++ et j'ai du mal à résoudre mon problème... j'ai une chaîne de caractères de longueur variable qui est par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "1.25,5,2.541,4.6,4,5.4,7.85,2.1,0,0,0,0,0,0,0,0"
    et j'aimerai récupérer les nombres dans un tableau de double.
    Je suis embêtée par le fait que je ne sais pas à l'avance le nombre de caractères entre chaque ",". En revanche je sais qu'il y a toujours 16 nombres dans la liste.

    J'ai essayé de résoudre ça avec des expressions régulières, mais je travaille dans un environnement de développement un peu particulier qui fait que je n'ai pas accès au "include <regex>" et donc à la fonction regex_search().

    Pouvez-vous m'aider?
    Merci d'avance.

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    Tu mets ça dans un std::istringstream et tu fais une boucle qui récupère un double et un char (pour la virgule) tant que le std::istringstream n'est pas vide.

    http://www.cplusplus.com/reference/s...istringstream/

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    en utilisant getline, ca va être facile.
    voici un exemple:

    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
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <vector>
     
    vector<double> extract(std::istream input) {
        vector<double> data;
        std::string line;
        while(std::getline(input, line, ',')) {
            std::istringstream iss(line);
            double d;
            iss>>d;
            data.push_back(d);
        }
        return data;
    }
     
    #include <fstream>
    using namespace std;
    int main() {
        istringstream input("12.5,13.7,4.0,0.8,9.7");
        vector<double> nombres = extract(input);
        fstream fichier("data.txt");
        vector<double> autres_nombres = extract(file);
        //ce que tu veux
    }
    tu peux faire encore mieux avec un peu de template:
    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
    template <typename T>
    vector<T> extract(std::istream input) {
        vector<T> data;
        std::string line;
        T d;
        while(std::getline(input, line, ',')) {
            std::istringstream iss(line);
            iss>>d;
            data.push_back(d);
        }
        return data;
    }
     
    int main() {
        std::istringstream input("12.5,13.7,4.0,0.8,9.7");
        vector<double> doubles = extract<double>(input);
        vector<float> floats = extract<float>(input);
        //ce que tu veux
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci pour vos réponses,
    malheureusement leternel je ne peux pas utiliser ta solution car je ne peux pas inclure <vector>...
    par contre j'ai réussi avec ta solution Ehonn:
    Mettons que j'ai une chaine char* maChaine qui vaut "1,2,3,4,5,6,7,8,9,10":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    double monTableau[10];
    std::string str(maChaine);
    std::istringstream iss(str);
     
    for(int i=0; i<10; i++)
    {
        double valeur;
        char virgule;
        iss >> valeur;
        iss >> virgule;
        nomTableau[i]=val;
    }
    ça fonctionne parfaitement (y compris si je mets des nombres décimaux)! Merci beaucoup

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    dans ce cas, tu as aussi iss.ignore(1), pour ignorer la virgule.

    dans ma solution, j'utilise un vector, mais si tu ne fais pas de fonction, ca marche aussi avec un tableau.

    Cela dit, pourquoi sais-tu qu'il y a exactement 10 nombres et 10 virgules?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci pour le ignore(1), c'est mieux que ma variable "virgule" ^^

    En fait le programme sur lequel je travaille est un simulateur qui prend en paramètre d'entrée un certain nombre de choses avec à chaque fois un format bien défini.
    Ma chaîne de caractères est l'un de ces paramètres d'entrée, et cela à été défini de façon à ce qu'il y ait une valeur constante de nombres dans la chaîne.
    Mon "10" (en fait c'est 16 je me suis trompée dans mon post précédent) est donc une constante de mon programme.

    En utilisant ta solution avec un tableau, je retombe presque sur le code de mon dernier post, hormis que la boucle for est remplacée par une boucle while tant que la chaîne n'est pas vide (c'est aussi ce que m'avais dit Ehonn au départ).

    Dans mon cas les deux fonctionnent, mais effectivement il vaut mieux utiliser la boucle sur la longueur de la chaîne pour que cela fonctionne quelle que soit sa taille.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Citation Envoyé par mokochan Voir le message
    Dans mon cas les deux fonctionnent, mais effectivement il vaut mieux utiliser la boucle sur la longueur de la chaîne pour que cela fonctionne quelle que soit sa taille.
    Hmmm...non, si tu ne veux pas d'ennuis avec un tableau (dépassement de la la taille du tableau) il faut faire un for calculé à partir de ta constante de taille du tableau....

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

Discussions similaires

  1. [MySQL] récupérer des images à partir d'une base de données mysql
    Par j_esti dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 21/04/2011, 13h34
  2. Réponses: 3
    Dernier message: 21/03/2009, 22h24
  3. Récupérer des données à partir d'une URL ?
    Par Bebert71 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 19/02/2009, 12h53
  4. Réponses: 2
    Dernier message: 09/07/2008, 15h20
  5. Récupérer des floats à partir d'une string
    Par hamster dans le forum SL & STL
    Réponses: 8
    Dernier message: 09/06/2005, 08h10

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