Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question d'ordre pratique a proposde la lecture des fichiers

"f 1/2/3" comment lire cette ligne et stocker chaque chiffre dans une variable differente??

Sujet résolu
    15 mai 2008 à 23:38:36

    Bonjour chers zéros j'ai a vous poser une question d'ordre pratique:
    pour gérer les textures dans mon chargeur d'obj,j'utiliserai l'UVmapping.
    Pour cela je lis les données depuis le fameux fichier .obj
    Mais il y a un type de lignes que je n'arrive pas à exploiter :
    f 1/1/1 2/2/1 3/3/1 4/4/1

    je suis sensé stocker chaque nombre séparément;je m'explique:
    Dans le premier groupe,chaque 1 doit etre stocké dans une variable différente,
    Dans le 2eme groupe chacun des trois chiffres doit aussi etre stocké dans sa propre variable
    D'après vous ,comment résoudre ce casse-tête?


    L'opérateur de flux ifstream>> prend tout le groupe et évidement ca plante
    La méthode ifstream.get(char) stocke les nombres sous forme de caractères et en bref c'est pas bon.

    Donc si quelqu'un peut m'aider ..bienvenue a lui!

    • Partager sur Facebook
    • Partager sur Twitter
      16 mai 2008 à 0:36:22

      std::getline? Définir un objet triplet, et l'opérateur d'extraction associé?
      (Ceci dit, les flux pour les formats un peu tordu, cela devient vite complexe)
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        16 mai 2008 à 0:58:19

        woaw comment on fait ca?
        • Partager sur Facebook
        • Partager sur Twitter
          16 mai 2008 à 1:12:12

          Non testé
          struct Triplet {
              int a;
              int b;
              int c;
              Triplet(int aa, int bb, int cc) : a(aa), b(bb), c(cc) {}
          };
          
          std::istream & operator>>(std::istream &is, Triplet & t) {
             int a,b,c; char ch;
             if (!(is >> a >> ch && ch == '/')) {
                is.setfailbit(); // doute sur la fonction
                return is;
             }
             if (!(is >> b >> ch && ch == '/')) {
                is.setfailbit(); // doute sur la fonction
                return is;
             }
             if (!(is >> c)) {
                return is;
             }
             t = Triplet(a,b,c);
             return is;
          }
          
          ...
          std::string ligne;
          for (int ln=1; std::getline(fichier, ligne) ; ++ln) {
              std::istringstream iss(ligne);
              std::string premierChamp;
              Triplet t1, t2, t3;
              if (iss >> premierChamp >> t1 >> t2 >> t3) {
                 faireQqchDe(premierchamp, t1, t2, t3)
              } else { throw erreur à la ligne ln }
          }
          

          (Bref, c'est vite lourd à écrire)
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            16 mai 2008 à 1:21:47

            oulah faudra que j'étudie ca

            A quoi servent les classe istream et istringstream?


            Euh ...
            il y a un probleme lmghs .l'opérateur stocke jusqu'au prochin caractere de délimitement (espac,retour a la ligne,etc...)
            donc ton code stockera tout un groupe dans la variable.Et on devine aisément que "1/1/1" stocké dans un int ca pose probleme...


            ...Vous savez pour le coup je me sens stupide .J'avais stocké dans un string.
            Quand on utilise std::ifstream::operator>>(int nombre) ce qui est stocké est bien le nombre et le slash n'est pas stocké.
            Desolé du dérangement
            • Partager sur Facebook
            • Partager sur Twitter

            Question d'ordre pratique a proposde la lecture des fichiers

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown