CLASS SIMPLE POUR LIRE DES FICHIER *.INI

Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009
- - Dernière réponse : shenron666
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
- 8 janv. 2009 à 23:09
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48810-class-simple-pour-lire-des-fichier-ini

shenron666
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
non c'était récupérer un couple clef valeur dans une section et cette même clef avec potentiellement une autre valeur dans une autre section, et ça sa classe le fait

par contre, on n'a pas la possibilité de récupérer une section pour parcourir les clefs qu'elle contient
lglandeur
Messages postés
28
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
20 janvier 2009
-
Shenron666, en fait si je comprends bien se que tu veux dire c'est que l'on pourrait juste préciser la section, et dans se cas cella renvoi tous les couple clef/valeur de la section?

Si c'est bien cela je n'en vois pas trop l'intérêt car cela voudra dire que le devras gérer la recherche de clef de nouveau dans le programme alors que c’est déjà fait dans la class.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1 -
Oui, shen, c'est la méthode qui m'a eu été enseignée en conception logicielle et que j'applique toujours.

Magicalement
shenron666
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
laisses tomber pour la section, j'ai compris pourquoi ça ne marchait pas sur mon programme
j'ai des clefs avec des / et je n'avais pas vu que dans ton code tu concaténais la clef et la section avec un /
dommage ça partait d'une bonne idée
shenron666
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
quand je disais que tu ne prenais pas en compte les sections dans ta lecture, je visais le cas de figure où pour exemple :
- tu as une section [Section1] avec un couple clef/valeur "Sélection = 2"
- tu as une section [Section2] avec un couple clef valeur "Sélection = 0"

comment je fait pour récupérer le paramètre de [Section1] et le paramètre de [Section2] dans mon application ?

MAGIC_NONO, tu parles de déclarer ton template dans un cpp et de l'inclure à la fin du hpp ? c'est une "astuce" qui fonctionne même si elle fait un peu bidouille
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1 -
ok merci, en effet j'avais parcourus un peu trop rapidement le source.

Pour le problème de template, il peut tout a fait être défini dans un cpp (dans un soucis d'homogénéité de l'ensemble du code)

il suffit juste de veiller à l'exclure des sources compilées.
lglandeur
Messages postés
28
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
20 janvier 2009
-
pour ce qui est de la recherche de sources, cela à bien été effectuée. Mais je n'ai pas non plus poussé le visse a chercher pendant 2-3 jours juste pour pouvoir lire un pauvre petit fichier ini. De plus la majorité des sources que je trouvé utilisait elle même les fonctions de windows pour accédai au fichier (et le reste dépendais d'autre librairie à installer).

pour savoir si la clef existe ou non je le voyais plutôt en utilisant une fonction de teste que un retour de la par de la fonction GetValue. Et donc venir tester avant de demander la récupération de la valeur.
Le fait d'utiliser une valeur par défaut me paressai une bonne idée car justement sa permet de demander une clef sans se soucier du fait que la clef existe ou nous dans le fichier ini. Maintenant pour se qui et du fait de l'enregistrer dans la map j'avoue que ce n'est pas forcement utile.

sinon je ne vois pas se que tu veux dire par le fait que je ne prenne pas en compte les sections dans la lecture, pourrais-tu m'expliquer ça stp?

La déclaration de mes template était la même que ceux actuellement utilisé et se trouvai bien de le fichier .h, la seul différence vient du fait que le constructeur de ma class été défini dans un fichier cpp.
shenron666
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
-
j'avais déposé une source MFC facilement adaptable à la std sur codes sources
tu es sûr que tu as cherché ? parcequ'il y a quelques sources simples n'utilisant pas les fonctions windows sur le net

sinon tu ne prends pas du tout en compte les sections dans ta lecture
enfin comme tu ne semble t'intéresser qu'à la lecture ça ne pose pas de problème

le coup de la valeur par défaut c'est pas terrible
normalement tu dois dire si la clef existe ou non, les paramètres dans le fichier ini ne peuvent pas toujours avoir une valeur par défaut

pour ton problème de multiple définition, tu peux montrer comment tu codes ton template ?
notes que tu ne peux coder de template dans un cpp, uniquement dans le hpp
lglandeur
Messages postés
28
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
20 janvier 2009
-
j'ai effectué la modification que tu propose Tibur pour le defaulValue, dans l'optique de faire peut être un jour la fonction INIParser::Save() (qui je l'avoue n'est pas ma priorité).

Sinon je me suis aperçue que en n'utilisant qu'un seul fichier pour ma class avec la déclaration de celle-ci et la description de ses fonctions, je pouvais faire la spécialisation de la fonction GetValue.
Alors que si je met juste le fonction non template dans un fichier cpp je me retrouve avec une erreur de multiple définition pour le type string.

Est-ce-que quelqu'un pourrais m'expliquer pourquoi?
cs_tibur
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009
-
Bah, le set value, je le voit plutôt directement dans le GetValue : si la clé n'est pas trouvée, tu set la valeur dans ta map.

if(it != ini.end())
// (...)
}
else {
std:stringstream ss;
ss << defaultValue;
ini[Section+"/"+clef] = defaultValue.str();
return defaultValue;
}

Bon, il reste juste INIParser::Save();

Ark, encore casse couille, cette histoire de string ou de char * ...
lglandeur
Messages postés
28
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
20 janvier 2009
-
Désoler Magic_nono mais j'avais mal compris ton probème.

en fait a l'origine je voulais faire une spécialisation de la fonction pour le type string, mais je me retrouvais avec une erreur de multiple déclaration.

Alors j'ai ajouté cette condition "if(typeid(T) == typeid(std::string))" qui permet de tester si le type utiliser et std::string.

Donc c'est seulement si le type utilisé est le std::string qu'il y a l'opération "val += ' ' + tmp", qui me permet de récupérer une phrase complète même si il y a des espace utilisé.

j'espère que je répond bien a ta question cette foi.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1 -
#
# template <class T> T INIParser::GetValue(const std::string &Section, const std::string &clef, T const &defaultValue)
# {
...
# T val;
...
# T tmp;
...
# val += ' ' + tmp;
# return val;
...

c'est sur la ligne

# val += ' ' + tmp;

que je tique
lglandeur
Messages postés
28
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
20 janvier 2009
-
désoler de te contredire Magic_nono mais tu n'est pas obligé de récupérer une variable de type string, tu peut aussi récupérer des variable de type entier, réél, booléen, et encore d'autre type, d'où l'utilisation du type template.

Les seuls restriction que je vois sont que les données doivent être récupérable depuis une seul ligne et que l'operateur >> doit être surcharger pour les flux de type istringstream.

Désoler si je ne suis pas bien clair dans les explications.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1 -
implémentation sympa,
par contre, pourquoi le type template

# template <class T> T INIParser::GetValue(const std::string &Section, const std::string &clef, T const &defaultValue)

car c'est forcément un string...

avec du char* ça ne marcherai pas, vu les opérations effectuées dessus...

Est ce pour permettre un CString, AnsiString, UString ou autre?

( de l'unicode ne devrait pas fonctionner ici)
lglandeur
Messages postés
28
Date d'inscription
samedi 11 juin 2005
Statut
Membre
Dernière intervention
20 janvier 2009
-
c'est vrais que je n'avais pas pensé a mettre une valeur par défaut au GetValue.

Par contre pour se qui et de l'implémentation de la fonction SetValue je ne pense pas le faire. Mais si quelqu'un à le courage de la faire je suis preneur.

merci Tibur pour l'idée de la valeur par défaut
cs_tibur
Messages postés
101
Date d'inscription
samedi 9 février 2002
Statut
Membre
Dernière intervention
5 mai 2009
-
Hello
Ca serait sympa d'avoir en plus une valeur par défaut en modifiant ta fonction GetValue en :

template <class T> T GetValue(const std::string &, const std::string &, T const & defaultValue){
//(...)
else
return defaultValue;
}

Ca sera plus logique que de renvoyer 0. Et pis ça te permettera aussi d'implementer une fonction save, un peut comme la classe QSettings de Qt (http://doc.trolltech.com/4.4/qsettings.html) : tu fais des GetValue avec les valeurs par defaut de l'application et tu fais save. La prochaine fois que l'appli est lancée, les GetValue te renvoyent les valeurs du fichier ini.