Lire paramétrage de trame dans un fichier.INI

Résolu/Fermé
odin13 Messages postés 41 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 16 mai 2007 - 9 mai 2007 à 23:43
odin13 Messages postés 41 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 16 mai 2007 - 10 mai 2007 à 15:42
Bonjour a tous!

Voici mon probléme: je dois lire un paramétrage du style:
[GLOBAL]
delaiR=2
timeOut=5
pause=20

[trame1]
ageMax=25
ssechantillonnage=5
priorite=2

[trame2]
ageMax=17
ssechantillonnage=41
priorite=1

[trame3]... [trame4]... [trame5].......suivant le paramétrage de l'utilisateur


-Mon probleme c'est que je sais lire les valeurs dans
[GLOBAL] .
-En revanche je ne sais pas lire dans
les trames [trameN] car l'utilisteur peut
parametrer autant de trames qu'il le souhaite.

Si quelqu'un peut me donner un ptit coup de main pour
m'expliquer comment afficher par
exemple:
trame1: agemax=25 ssechantillonnage=5 ...
trame2 : agemax=25ssechantillonnage=5 ...trame3: ...

puis pour autant de trames que l'utilisateur le souhaite

Aidez moi!! jsuis désespéré!! lol Un grand merci d'avance!!!
A voir également:

3 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 mai 2007 à 08:51
Tu programmes dans quel langage ?
0
odin13 Messages postés 41 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 16 mai 2007
10 mai 2007 à 09:19
Jsuis en c++

pour lire les filchier dans globale je fais:

long CFichierINIOid::GetDelai_R()
{
long temp;
temp = GetLong("GLOBAL","DELAI_R","0");
return temp;
}

Mais pour les trames (avec leur propre paramétrages) etant donnée qu'il peut y en avoir autant que le souhaite l'utilisateur du cou je ne sais pas trom comment m'y prendre.
Merci
0
odin13 Messages postés 41 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 16 mai 2007
10 mai 2007 à 11:28
Sniff personne ne m'aide :-(
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
10 mai 2007 à 15:10
#include <fstream>
#include <iostream>
#include <string>
#include <map>

typedef std::string cle1_t;
typedef std::string cle2_t;
typedef std::string data_t;

/**
 * \return true si c'est une ligne correspondant à une clé1
 * (commence par '[', et finit par ']')
 */
bool read_cle1(const std::string & line,cle1_t & cle1){
    std::size_t len = line.length();
    if(line[0]!='[' && line[len-1] != ']') return false;
    if(len>2) cle1 = line.substr(1,len-2);
    return true;
}

/**
 * \return true si c'est une ligne correspondant à une clé2
 * (ligne contenant exactement un '=')
 */
bool read_cle2(const std::string & line,cle2_t & cle2,data_t & data){
    std::size_t len = line.length();
    bool ok = false;
    unsigned int pos_egal;
    for(std::size_t i=0;i<len;++i){
        if(line[i] == '=' && !ok){
            if(ok) return false; // plusieurs '=' dans la ligne
            ok = true;
            pos_egal = i;
        }
    }
    if(ok){
        if(pos_egal>0)     cle2 = line.substr(0,pos_egal-1);
        if(pos_egal<len-1) data = line.substr(pos_egal+1,len);
    }
    return ok;
}
typedef std::map<cle1_t,std::map<cle2_t,data_t> > datas_ini_t;

/**
 * \brief Lit un fichier.ini
 */
void read_ini(std::ifstream & ifs,datas_ini_t & datas_ini){
    std::string line;
    cle1_t cle1;
    cle2_t cle2;
    data_t data;
    for(unsigned int noline=1;std::getline(ifs,line);++noline){
        if(line.empty()) continue;
        bool cle1_lue = read_cle1(line,cle1);
        if (!cle1_lue){
            bool cle2_lue = read_cle2(line,cle2,data);
            if(cle2_lue) datas_ini[cle1][cle2] = data;
            else std::cerr << 'l' << noline << ": invalid line: " << line << std::endl;
        }
    }
}

/**
 * \brief Affiche la structure représentant un fichier.ini
 */
void show_datas_ini(const datas_ini_t & datas_ini){
    datas_ini_t::const_iterator dit1(datas_ini.begin()),dend1(datas_ini.end());
    for(;dit1!=dend1;++dit1){
        const cle1_t & cle1 = dit1->first;
        const std::map<cle2_t,data_t> & cur_map = dit1->second;
        std::map<cle2_t,data_t>::const_iterator dit2(cur_map.begin()),dend2(cur_map.end());
        for(;dit2!=dend2;++dit2){
             const cle1_t & cle2 = dit2->first;
             const data_t & data = dit2->second;
             std::cout << cle1 << '\t' << cle2 << '\t' << data << std::endl;
        }
    }
}

int main(int argc,char **argv){
    // Contrôle des arguments
    if(argc != 2){
        std::cerr << "usage: " << argv[0] << " filename.ini" << std::endl;
        return 1;
    }

    // Ouverture du fichier
    const char *filename = argv[1];
    std::ifstream ifs(filename);
    if(!ifs){
        std::cerr << "invalid file: " << filename << std::endl;
        return 2;
    }

    // Lecture et affichage du fichier
    datas_ini_t datas_ini;
    read_ini(ifs,datas_ini);
    show_datas_ini(datas_ini);

    // Fermeture du fichier
    ifs.close();
    return 0;
}

Exemple:
(mando@cenedra) (~) $ cat plop.txt
[cle1]
sous_cle_1a=data_1aaaa
sous_cle_1b=data_1b
sous_cle_1c=data_1c
sous_cle_1a=data_1a

[cle2]

sous_cle_2a=data_2a
sous_cle_2b=data_2b

(mando@cenedra) (~) $ g++ -W -Wall plop.cpp
(mando@cenedra) (~) $ ./a.out plop.txt
cle1    sous_cle_1a     data_1a
cle1    sous_cle_1b     data_1b
cle1    sous_cle_1c     data_1c
cle2    sous_cle_2a     data_2a
cle2    sous_cle_2b     data_2b

Tu feras attention parce que je ne contrôle pas les espaces dans la lecture des clés. En utilisant habilement la commande isspace tu peux filtrer aisément les espaces en début et fin de chaîne si tu le souhaites...

Bonne chance
0
odin13 Messages postés 41 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 16 mai 2007
10 mai 2007 à 15:42
Je te remercie de ton aide!! Je vais etudier tous cela!! lol
0