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
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
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 epub - Guide
- Lire un fichier .bin - Guide
- Lire iso - Guide
- Paramétrage double écran - Guide
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
10 mai 2007 à 08:51
Tu programmes dans quel langage ?
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
10 mai 2007 à 11:28
Sniff personne ne m'aide :-(
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
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
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
10 mai 2007 à 15:42
Je te remercie de ton aide!! Je vais etudier tous cela!! lol
10 mai 2007 à 09:19
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