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 :

FLUX - Façon efficace de lire un fichier texte


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut FLUX - Façon efficace de lire un fichier texte
    Bonjour, quelle serait la facon la plus efficace de lire un fichier texte qui ressemble à ca:

    /* VMM config file */
    taillenoeuds: 1
    rgbnoeuds: 0,0.8,0
    rgbsegmentsw: 0,0.8,0
    rgbsegmentsr: 1,0,0
    rgbbordersw: 0,0.8,0
    rgbbordersr: 0,0,0
    rgbrender: 0,0.8,0
    rgbbackground: 0,0,0.4
    glpolygonoffset: 1
    Je ne vois pas vraiment comment faire mis à part lire ligne par ligne, faire un IF sur le substring jusqu'au : et prendre les valeurs apres le : selon chaque cas

    Vous voyez une méthode plus efficace?



    Également je pensais me faire une fonction template qui lit les fichiers, mais je me trouve devant un problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    inline void Util::Lire(const std::string& filepath, std::stringstream &buffer)
    {
        std::ifstream myfile(filepath.c_str());
        if (!myfile) {
            std::cerr << "Erreur de lecture." << std::endl;
            return;
        }
        buffer << myfile.rdbuf();
        myfile.close();   
    }
    Je perd la possibilité de lire le fichier ligne par ligne non si je suis rendu avec un stringstream?

  2. #2
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    S'il peut y avoir des erreurs dans le fichier -> parser dédié.
    C'est plus simple, AMHA, que de lutter avec les flux standard.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Parser dédié? C'est quoi?

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Je suppose que c'est un parser fait pour / adapté à ce modèle de fichier.

  5. #5
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Le mieux je que peux afire pour le moment c'est:


    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    bool GL_MAILLAGE::LoadConfig(const std::string& pathtoload)
    {
         std::ifstream myfile(pathtoload.c_str());
         if (!myfile) {
             std::cerr << "Erreur de lecture." << std::endl;        
             return 0;
         }
     
         std::string line;
         int i = 0; // numéro de la ligne
     
         while (! myfile.eof()) {     
               ++i;
               getline(myfile, line);
               if (i == 1) 
                   if (line != C_CONFIGFILE_TAG) // premiere ligne doit être = /*vmm config file*/
                       return 0;
                   else
                       continue; 
     
               std::string value = line.substr(line.find(':') + 1);    // valeur du paramètre
     
               if (i == 2) {
                  double taillenoeuds;
                  Util::FromStrToAny(value,taillenoeuds);
                  SetSizeNoeuds(taillenoeuds);  
               }
               else if (i == 10) {
                        double offset;
                        Util::FromStrToAny(value,offset);
                        SetPolygonOffset(offset);  
                    }
                    else {
                        std::vector<double> rgbparam = GetColorConfig(value);
                        double r = rgbparam.at(0);
                        double g = rgbparam.at(1);
                        double b = rgbparam.at(2);
                        switch (i) {
                             case 3:
                                   SetRGBNoeuds(r,g,b);
                                   break;
                             case 4:
                                   SetRGBSegmentsW(r,g,b);
                                   break;
                             case 5:
                                   SetRGBSegmentsR(r,g,b);
                                   break;
                             case 6:
                                   SetRGBBordersW(r,g,b);
                                   break;
                             case 7:
                                   SetRGBBordersR(r,g,b);
                                   break;
                             case 8:                    
                                   SetRGBRender(r,g,b);
                                   break;
                             case 9:
                                   SetRGBBackground(r,g,b); 
                                   break;
                        }
                    }
         }
         return 1;
    }

    En gros je fonctionne avec le numéro de la ligne
    Vous voyez un meilleur moyen?

Discussions similaires

  1. Réponses: 13
    Dernier message: 11/06/2007, 16h30
  2. [Applet] lire un fichier texte
    Par lebesnec dans le forum Applets
    Réponses: 2
    Dernier message: 07/07/2005, 10h09
  3. Réponses: 1
    Dernier message: 24/11/2004, 16h54
  4. [Fichier] Lire un fichier texte long
    Par _Eric_ dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/08/2004, 15h22
  5. Réponses: 2
    Dernier message: 26/05/2004, 17h53

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