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 :

fscanf ne fonctionne pas


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 18
    Points
    18
    Par défaut fscanf ne fonctionne pas
    Bonjour,

    J'ai le fichier suivant à lire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    160   3.1822565e-01
       6.1230318e-17   0.0000000e+00  -1.0000000e+00
       2.8173256e-01   0.0000000e+00  -9.5949297e-01
       1.7565738e-01   2.2026738e-01  -9.5949297e-01
    J'ai donc écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    unsigned int nS;
    double r;
      if(fscanf(f, "%i %f\n", &nS, &r)==EOF) return false;
     cout << "nb de points = " << nS << endl;
     cout << "rayon = " << r << endl;
      double xx,yy,zz;
      if(fscanf(f, "%lf %lf %lf\n", &xx, &yy, &zz)==EOF) return false;
        cout << "xx = " << xx << endl;
        cout << "yy = " << yy << endl;
        cout << "zz = " << zz << endl;
    ce qui me renvoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nb de points = 160
    rayon = 3
    xx = 6.94418e-310
    yy = 1.53153e-316
    zz = 3.40905e-322
    1) Le rayon n'est pas bon il me prend que le premier chiffre
    2) La deuxième ligne est complètement fausse, fscanf n'a pas réussi à socker les valeurs dans les variables xx,yy,zz.

    Si je récupère déjà la chaine correspondant au rayon ça me prend bien 3.1822565e-01, mais si ensuite je veux la caster en double via atof() ça m'affiche de nouveau 3 ! En fouillant sur le forum je suis tombé sur ce fil : http://www.developpez.net/forums/d29...fonction-atof/, et comme j'utilise la lib qglviewer dans mon programme principal je me dis que c'est peut-être un peu pareil... comment faire ?

    Ce qui est étrange c'est que le même code tourne sans problèle sur le PC de mon prof. Donc ce n'est pas un problème dans le code mais une histoire d'architecture ou de compilation. Je compile via un Makefile généré par le .pro suivant (avec qmake-qt4) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TARGET = pointsToSurface
    CONFIG *= qt opengl release
    QT *= opengl xml
    QMAKE_CXXFLAGS += -Werror
     
    HEADERS = geom.h iso_value.h data_struct_algo.h pointsToSurface.h eventWidget.h viewer.h
    SOURCES = geom.cpp iso_value.cpp data_struct_algo.cpp pointsToSurface.cpp eventWidget.cpp viewer.cpp main.cpp
     
    LIBS *= -lqglviewer-qt4
    INCLUDEPATH *= /home/inf0phile/Téléchargements/libQGLViewer-2.3.17
    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Salut,

    Étrage en effet, essaye d'utiliser std::ifstream comme tu es en C++.

    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
     
    std::ifstream file("tonfichier.extension");
    unsigned int ns;
    double r, xx, yy, zz;
     
    file >> ns;
    file >> r;
     
    for (int i = 0; i < ns; i++)
    {
      file >> xx;
      file >> yy;
      file >> zz;
      // Je crois que file >> xx >> yy >> zz; fonctionne aussi mais pas sûr
      if (file.good() || file.eof())
        tonTraitement(r, xx, yy, zz);
    }
    Ce code devrait fonctionner je pense.
    Après, à la place de "tonTraitement", tu peux faire ce que tu veux genre ajouter à une liste/file ou autre.

    EDIT: Ce code ne tient pas compte du nombre d'espaces entre tes données ce qui est pratique.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Ca y est j'ai réussi à lire mes données, il fallait utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale(LC_NUMERIC,"C");
    En fait je pense que QGLViewer doit changer la localisation à l'init.

    Maintenant le problème c'est que QGLViewer n'est plus capable d'afficher les points... comment rétablir la localisation?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Le plus simple serait de faire ton parsing avant d'appeler QGLViewerInit.

    Et sinon essaye quand même avec l'ifstream (cf. mon premier post) qui est un objet C++, peut-être qu'il n'est pas affecté par la fonction C setLocale() .

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    OK votre solution fonctionne (sans avoir recours à setlocale) et permet bien de stocker les points lus dans le fichier dans la liste _points.

    Mais QGLViewer ne parvient toujours pas à afficher les points :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Viewer::draw() {
     v_Point3D pts = _pointsToSurface.inputPoints();
      glPointSize(8.0f);
      glBegin(GL_POINTS);
      glColor3f(1.0f,0.0f,0.0f);
      glVertex3f(10.0,0.0,0.0);  // lui il l'affiche bien !
      for(unsigned int i=0;i<pts.size();++i) {
        pts[i].print(); // affiche dans le terminal les 3 coordonnées, j'ai vérifié elles sont bonnes
        glVertex3f(pts[i].x,pts[i].y,pts[i].z); // eux ne s'affichent pas
      }
     
      glEnd();
    Les coordonnées sont bonnes mais elles ont des "," comme séparateur et non des points !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Bon finalement ça fonctionne avec ifstream, sans toucher au setlocale, merci !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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