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 :

sscanf : erreur assez bizzard


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut sscanf : erreur assez bizzard
    Bonjour,

    J'ai un fichier qui contient ceci:
    vert 0 ( 29.605044 13.305720 ) 0 1
    vert 1 ( -24.200173 13.305725 ) 1 1

    Je fait une lecture ligne par ligne et pour récupérer les données, je fait ceci:
    int ret = sscanf(buff, " vert %d ( %f %f ) %d %d", &vertIndex, &fdata[0], &fdata[1], &idata[0], &idata[1]);

    Sur windows, ça fonctionne parfaitement, ret contient bien la valeur 5.
    Par contre sur Linux, ret vaut 2 et non 5.

    Après avoir passé 1h à traquer cette erreur, j'ai compris que le sscanf ne lisait pas bien les float.
    Un heure encore après, j'ai remplacer les "." par des "," dans mon fichier et la miracle : ça fonctionne !

    Y-aurait-il une version de sscanf pour l'europe et une pour l'amérique ?!!!!!!!
    Si oui, comment sélectionner le sscanf américain ?

    Merci...

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Ça sent un problème de locale. Tu as un setlocale dans ton programme?

    Sous Linux, exécute la commande locale dans le terminal d'où tu lances ton programme pour voir celle qui est utilisée. Tu peux essayer de lancer ton programme avec un LC_ALL=C.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Non, je n'ait pas de setlocale dans mon programme.

    $ locale
    LANG=fr_FR@euro
    LANGUAGE=fr_FR@euro
    LC_CTYPE="fr_FR@euro"
    LC_NUMERIC="fr_FR@euro"
    LC_TIME="fr_FR@euro"
    LC_COLLATE="fr_FR@euro"
    LC_MONETARY="fr_FR@euro"
    LC_MESSAGES="fr_FR@euro"
    LC_PAPER="fr_FR@euro"
    LC_NAME="fr_FR@euro"
    LC_ADDRESS="fr_FR@euro"
    LC_TELEPHONE="fr_FR@euro"
    LC_MEASUREMENT="fr_FR@euro"
    LC_IDENTIFICATION="fr_FR@euro"
    LC_ALL=

    Et comment je fait pour lancer mon programme avec un LC_ALL=C ?

    J'ai esseyé un #pragma setlocale("english") mais mon compilateur me dit qu'il l'ignore...

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par casafa
    Non, je n'ait pas de setlocale dans mon programme.
    Tu ne l'as peut-être pas fait, je parie qu'il est fait avant l'exécution de ton sscanf...

    Et comment je fait pour lancer mon programme avec un LC_ALL=C ?
    Comme pour n'importe quelle variable d'environnement... La manière la moins courante mais qui a l'avantage de fonctionner quelque soit ton shell:
    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    env LC_ALL=C prog arg arg arg

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Merci mais : "env LC_ALL=C pgm" ==> mon programme ne se lance même pas.
    Et puis de toutes façon ce n'est pas une bonne solution....si je doit demander à chaque utilisateur de mon programme de lancer le programme avec LC_ALL....

    Pourquoi mon compilateur me dit ceci avec cette ligne : "#pragma setlocale("english")" :
    warning: ignoring #pragma setlocale

    NB: J'ai g++ 4.1.2

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    J'ai vient de trouvé la fonction setlocale(LC_CTYPE, "En_GB.IBM-850"); qui se trouve dans locale.h et ça fonctionne.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par casafa
    NB: J'ai g++ 4.1.2
    C'est un compilateur C++. Le compilateur C s'appelle gcc.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/04/2009, 17h33
  2. Erreur 04030, Oracle 8i avec assez de RAM
    Par julien20vt dans le forum Administration
    Réponses: 5
    Dernier message: 08/02/2008, 17h04
  3. Message d'erreur "il n'y a pas assez d'espace disque
    Par Smix007 dans le forum Access
    Réponses: 18
    Dernier message: 17/01/2008, 15h15
  4. erreur en parcourant une map assez bizarre
    Par kass28 dans le forum SL & STL
    Réponses: 4
    Dernier message: 02/11/2007, 14h54
  5. Message d'erreur assez bizarre reportant à un nombre de ligne inexistant
    Par beegees dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/02/2007, 15h19

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