Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASS SIMPLE POUR LIRE DES FICHIER *.INI


Information sur la source

Catégorie :Fichiers / Disque Classé sous : fichier ini, class, template Niveau : Initié Date de création : 28/12/2008 Date de mise à jour : 08/01/2009 11:38:41 Vu / téléchargé: 1 267 / 113

Note :
Aucune note

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

Cette classe basic permet l'utilisation d'un fichier ini de façon très simple dans un programme.
Je l'ai réalisée car justement je ne trouvé pas de classe toute bête pour lire dans un fichier ini sans utiliser les fonction de la librairie windows.h (GetPrivateProfileString, WritePrivateProfileString).
Dans le zip vous trouverez un exemple simple qui montre comment utiliser cette class.
 

Source

  • class INIParser
  • {
  • private:
  • std::map<std::string, std::map<std::string, std::string> > ini;
  • std::string FileName;
  • bool AutoSave;
  • public:
  • INIParser(const std::string &, bool=false);
  • ~INIParser()
  • {
  • if(AutoSave) save();
  • ini.clear();
  • };
  • // permet de recupérer une valeur, et retourne une valeur par defaut si la clef n'est pas trouvé
  • template <class T> T GetValue(const std::string &, const std::string &, const T &);
  • // permet d'enregistrer une valeur, ou dans modifier une existante.
  • template <class T> void SetValue(const std::string &, const std::string &, const T &);
  • // enregistre la map dans un fichier.
  • bool save(std::string="");
  • };
  • // voir le zip pour la description des fonctions
class INIParser
{
	private:
		std::map<std::string, std::map<std::string, std::string> > ini;
		std::string FileName;
		bool AutoSave;
		
	public:
		INIParser(const std::string &, bool=false);
		~INIParser()
		{
			if(AutoSave)	save();
			ini.clear();
		};
		// permet de recupérer une valeur, et retourne une valeur par defaut si la clef n'est pas trouvé
		template <class T> T GetValue(const std::string &, const std::string &, const T &);
		// permet d'enregistrer une valeur, ou dans modifier une existante.
		template <class T> void SetValue(const std::string &, const std::string &, const T &);
		// enregistre la map dans un fichier.
		bool save(std::string="");
};

// voir le zip pour la description des fonctions

Conclusion

Est-ce que quelqu&#8217;un peut m&#8217;expliquer comment décrire les fonctions de la classe qui ne sont pas de type générique dans un fichier cpp. Car actuellement si je décris la fonction save, et le constructeur en dehors du fichier .h je me trouve avec une erreur de multiple définition.

Je suis ouvert à toute critique tant qu&#8217;elles sont constructives.

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

28 décembre 2008 19:10:50 :
modification description
28 décembre 2008 21:13:16 :
modification du code (et mise à jour du zip) pour ajouter la valeur par défaut a la fonction GetValue
28 décembre 2008 21:13:55 :
modification du code (et mise à jour du zip) pour ajouter la valeur par défaut a la fonction GetValue
29 décembre 2008 13:32:45 :
modification de la fonction GetValue pour enregistrer dans la map la clef si elle n'existai pas. Et spécialisation de la fonction GetValue pour les variables de type std::string
08 janvier 2009 11:38:42 :
Ajout des fonctions save et SetValue, pour pouvoir enregistrer et modifier la map. Ajout de la possibilité de sauvegarder automatiquement dans le fichier ini lors de la destruction de la variable.

Commentaires et avis

signaler à un administrateur
Commentaire de tibur le 28/12/2008 19:34:52

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.

signaler à un administrateur
Commentaire de lglandeur le 28/12/2008 21:10:23

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

signaler à un administrateur
Commentaire de magic_Nono le 28/12/2008 23:37:03

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)


signaler à un administrateur
Commentaire de lglandeur le 29/12/2008 00:39:13

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.

signaler à un administrateur
Commentaire de magic_Nono le 29/12/2008 01:57:10

#
# 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

signaler à un administrateur
Commentaire de lglandeur le 29/12/2008 11:21:07

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.

signaler à un administrateur
Commentaire de tibur le 29/12/2008 12:23:02

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 * ...

signaler à un administrateur
Commentaire de lglandeur le 29/12/2008 13:40:16

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?

signaler à un administrateur
Commentaire de shenron666 le 29/12/2008 23:15:14

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

signaler à un administrateur
Commentaire de lglandeur le 30/12/2008 00:25:49

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.

signaler à un administrateur
Commentaire de magic_Nono le 30/12/2008 06:05:46

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.

signaler à un administrateur
Commentaire de shenron666 le 30/12/2008 22:59:32

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

signaler à un administrateur
Commentaire de shenron666 le 30/12/2008 23:04:00

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

signaler à un administrateur
Commentaire de magic_Nono le 31/12/2008 14:23:02

Oui, shen, c'est la méthode qui m'a eu été enseignée en conception logicielle et que j'applique toujours.

Magicalement

signaler à un administrateur
Commentaire de lglandeur le 08/01/2009 11:46:36

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.

signaler à un administrateur
Commentaire de shenron666 le 08/01/2009 23:09:23

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

template [ par ifren ] salutje veux utilise une classe D utilisant une variable qui peut etre double ou string, je deirve de cette dernier deux autre class Dnum et Dstrpour Class derivée , Template ( POURQUOI ES-CE CI DIFFICILE) ??? [ par nawakator ] J'ai d&#233;j&#224; pos&#233; cette question, mais je la repose car elle est essentiel pour mon projet!J'ai cr&#233;er un template permettant de g&#23 virtual template [ par Guillemouze ] Salut, je voudrais savoir si il est possible de faire des fonctions virtuelles template. voici mon cas : class Type { &nbsp;&nbsp;&nbsp; void toto(in iterator sur class template [ par istdasklar ] Bonjour,je n'arrive pas a crée des iterator sur le container d'une classe template!Je m'explique par cette exemple :#include &lt;list&gt;using namespa template et l'héritage [ par imad_lol ] salut.dans mon programme je déclare 2 classe X et Y.les 2 classe sont des classes templates et Y hérite de X :template &lt;class typ&gt;class X{ };//* Question syntaxe C++ [ par max12 ] Bonjour,J'ai c'est la première fois que j'utilise les template en C++ et j'ai un soucis, c'est surement quelque chose de très simple au point que vous Template avec surcharge d'opérateurs [ par benjiiim94 ] &nbsp;&nbsp;&nbsp; Bonjour,J'essaie d&#233;s&#233;sp&#233;remment de cr&#233;er une petite classe pour me familiariser avec les templates. Non sans ma template et héritage [ par cybermax62 ] j'ai un probl&#232;me de fond dans ma conception. Je voudrais utiliser une classe template de base Singleton avec des classes h&#233;rit&#233;es (plus Class derivée, Surcharge, Template ??? [ par nawakator ] J'ai cr&#233;er 1class de Base class cTask et 2 class d&#233;river : class cTaskA:cTask et class cTaskB:cTask;La class de Base est virtuel;Je les stoc Template: Spécialisation partielle [ par luhtor ] Bonsoir, j'ai une classe d&#233;finie comme suit: template &lt;class _T, class _T_power&gt; class operator_binary_pow;et notamment une fonction membr


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 1,763 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.