Lire paramétrage de trame dans un fichier.INI
Résolu
odin13
Messages postés
41
Date d'inscription
Statut
Membre
Dernière intervention
-
odin13 Messages postés 41 Date d'inscription Statut Membre Dernière intervention -
odin13 Messages postés 41 Date d'inscription Statut Membre Dernière intervention -
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!!!
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:
- Lire paramétrage de trame dans un fichier.INI
- Lire le coran en français pdf - Télécharger - Histoire & Religion
- Lire un fichier epub - Guide
- Comment lire un message supprimé sur whatsapp - Guide
- Lire fichier bin - Guide
- Trame de fond word - Guide
3 réponses
#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
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