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 :

Parseur float negatif


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Parseur float negatif
    Bonjour, j'ai un soucis pour récupérer des flottant dans un fichier.

    Quand je tombe sur une ligne comme suit:
    -0.010691, 0.051655,-0.016581, 1.000000;;

    Pour récupérer les valeurs j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fichier,"%f,%f,%f,%f",&structure->Objet.back().position[12],&structure->Objet.back().position[13],&structure->Objet.back().position[14],&structure->Objet.back().position[15]);
    Si quelqu'un pouvait m'expliquer comment récupérer les valeurs cela m'aiderait bien!
    Merci d'avance!

  2. #2
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Ça manque de détail un peu ici. T'as un soucis, oui mais quel genre de soucis? T'es en C++?


  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Oui je suis en C++ mais le problème que je rencontre est indépendant du language j'imagine, je connais pas trop toutes les nuances entre le C et le C++! En fait je récupère plusieurs lignes qui ressemblent à celles la et quand je regarde ce qu'il y'a dans les variables c'est parfois erroné, mais parfois c'est correct!
    Après si je regardes dans les fichier je vérifie si je me suis pas manqué de ligne^^ on sait jamais mais non, alors je peux donner plusieurs exemples de ligne si cela peut aider à comprendre mon problèmeles lignes sont tels quel dans le fichier, les espaces sont conservés!).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                  -0.000000, 0.276113,-0.000000, 1.000000;;
                    -0.000000, 0.398344, 0.000000, 1.000000;;
                       0.000000, 0.151233, 0.000000, 1.000000;;
                     0.000000, 0.398497, 0.000000, 1.000000;;
                      -0.000000, 0.150174, 0.000000, 1.000000;;

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    La question est effectivement peu claire.

    Primo, puisque c'est du C++, il faut utiliser les flux. Voir notamment la fonction getline().

    Secundo, le problème auquel il est fait allusion est peut-être lié à la représentation des flottants. Dans ton premier message, tu dis "quand je tombe sur une ligne comme suit", mais tu ne dis pas ce que tu obtiens !

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Salut, le soucis c'est que tout le parseur est comme ça, et si tu me disais ce que tu entends par représentation des flottants?

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0.000000, 0.000000, 0.000000,
    j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0.000000, 0.000000, 0.000000,

    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -0.000000, 0.018031, 0.000000,
    j'obtiens
    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -0.080098, 0.174327,-0.009720,
    j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0 1.36856e-038 2.35214e-038

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Debutant1234 Voir le message
    si tu me disais ce que tu entends par représentation des flottants ?
    Tous les réels ne sont pas représentables en flottants.
    Si ton fichier a été écrit par des valeurs issues de flottants en double précision, et que tu essayes de les récupérer en tant que flottants à simple précision, il peut y avoir des arrondis.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bah les 2 premières sont bonnes mais la dernière n'est pas un arrondi c'est un résultat pas super cohérent, comment ferais tu pour récupérer ces valeurs toi ? (avec fscanf() ou sscanf peu importe, en me mettant le type de variable et tout ça donnerai quoi selon toi stp ?

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Parce que tu me parles des flux pour le C++ mais normalement les fonctions que j'utilise fonctionnent correctement en C++ je me trompe?
    D'ailleurs c'est un peu étrange car j'ai récupéré des milliers de float sans problème, la différence entre les 2 c'est

    0.000904, 1.147720,-0.019512, 1.000000;; celles avec les quels j'ai un prob et
    0.055330; 0.035015; 0.446646;,

    Je doute que le problème vienne de la virgule, est-ce que cela peut venir d'un problème d'allocation?
    Je vérifie en faisant une sortie direct de la valeur!

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pour le getline(), va voir cette page, en particulier la réponse de jtbell.

    Pour ton problème principal, je te propose pour l'instant de définir 4 variables flottantes juste avant ta boucle de lecture, de vérifier le fonctionnement, et de soumettre le code.

    Par ailleurs, ne pas hésiter à vérifier la valeur de retour de fscanf.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Au fait, avoir conscience que lorsque fscanf rencontre un problème dans la lecture du flux, il laisse les caractères non lus dans le flux, et ces derniers iront bousiller la lecture suivante.

    Si tu veux vraiment travailler avec fscanf, je te suggère d'aller dans le forum C, où tu trouveras des gens plus compétents.

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Si tu veux vraiment travailler avec fscanf, je te suggère d'aller dans le forum C, où tu trouveras des gens plus compétents.
    Lol à l'origine je l'avais posté la mais on l'a déplacé dans le forum C++!

    Au fait, avoir conscience que lorsque fscanf rencontre un problème dans la lecture du flux, il laisse les caractères non lus dans le flux, et ces derniers iront bousiller la lecture suivante.
    C'est bon à savoir je m'étais justement posé la question!

    Pour ton problème principal, je te propose pour l'instant de définir 4 variables flottantes juste avant ta boucle de lecture, de vérifier le fonctionnement, et de soumettre le code.
    Oui c'est comme sa que je comptais diagnostiquer pour savoir si cela vient du parseur ou d'autre part!

  12. #12
    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 : 50
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Debutant1234 Voir le message
    Lol à l'origine je l'avais posté la mais on l'a déplacé dans le forum C++!
    Il a été déplacé ici, parce que ce que tu lis, tu le stokes dans des objets. Mais la manière que tu as de les lire utilise des bibliothèques C que l'on évite généralement en C++ (et du coup je n'en connais pas l'usage)...

    Ensuite, je ne vois rien dans ton code pour sauter les ;; en fin de ligne.

    Globalement, la première question que je me poserais est de savoir si le fichier est orienté ligne ou pas. Si oui, on commence par une lecture ligne à ligne, puis on décompose chaque ligne, si non, il faut savoir comment il se découpe.

    Après, il y a plusieurs stratégies, selon ton format de fichier et sa rigueur (peut-il y avoir des espaces avant les virgules, des colonnes vides, quelque-chose entre les ;..). Par exemple, le plus simple (mais pas performant) est peut être de tout lire dans une string, de remplacer les , et ; par des espaces, puis de lire le fichier float par float ,sans se poser de questions.

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Ensuite, je ne vois rien dans ton code pour sauter les ;; en fin de ligne.
    En fait selon que j'ai beaucoup de lignes à lire du même type ou pas j'utilise fscanf() et fgets() après les tests sinon je fais un fgets() et je décompose avec sscanf()

    Globalement, la première question que je me poserais est de savoir si le fichier est orienté ligne ou pas. Si oui, on commence par une lecture ligne à ligne, puis on décompose chaque ligne, si non, il faut savoir comment il se découpe.
    Oui c'est ligne par ligne!

    Après, il y a plusieurs stratégies, selon ton format de fichier et sa rigueur (peut-il y avoir des espaces avant les virgules, des colonnes vides, quelque-chose entre les ;..)
    Oui il peut y avoir des espaces et cela change souvent regardes dans le message 3! Mais avant les virgules il n'y en a jamais, en revanche après les virgules il y'a soit un espace puis le nombre décimal si il est positif ou alors pas d'espace et le - du nombre décimal!

    Par exemple, le plus simple (mais pas performant) est peut être de tout lire dans une string, de remplacer les , et ; par des espaces, puis de lire le fichier float par float ,sans se poser de questions.
    Je vais essayer ça en attendant, en ce moment c'est pas trop gênant car je dois avoir que 2000 lignes du même type à lire mais cela va vite augmenter!(Je peux modifier le fichier à l'exportation pour qu'il mette des espaces à la place des virgules mais j'ai énormément de fichiers du même type qui sont comme ça tout retrouver risque d'être compliqué!)

    Pour l'autre sa serai un peu plus gênant car c'est plus 2000 mais 1 000 000 mais il fonctionne correctement donc!

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Apparement le parseur n'est pas en cause, merci à tous pour vos réponses, je continue mes recherches!

Discussions similaires

  1. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  2. [debutant???] Parseur & portabilté
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 24/07/2003, 13h20
  3. [7RC3] Formatage de champs float
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 2
    Dernier message: 19/05/2003, 09h38
  4. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32
  5. Réponses: 3
    Dernier message: 04/09/2002, 09h42

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