IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Je cherche l'équivalent C++ du concept de fichier Properties


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut Je cherche l'équivalent C++ du concept de fichier Properties
    Bonjour,

    en java il y a une classe qui permet d'extraire des elements dans un fichier "properties", très pratique pour se créer par exemple un fichier de configuration de ce type:

    OS = WinXP
    Langue = Fr
    Directory = C:\Programmes


    est-ce qu'il existe une librairie en C++ qui offre les mêmes services que cette classe java ?

    Merci

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    En C++ standard non. Mais bcp de libs C++ proposent ce genre de service (Boost.Program_options, Qt, ...). Tu développes avec quoi ?

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Salut,

    je developpe avec Visual studio 2003,

    je cherche une solution simple et rapide pour extraire des infos dans un fichier de config afin d'éviter de devoir créer un algorithme d'extraction d'infos dans un fichier

    l'idéal serait un truc du style

    le fichier:

    OS = WinXP

    le code:

    string valeur;
    valeur= fich.find("OS") // retourne l'element qui correspond à OS dans le fichier de config, cad "WinXP"

  4. #4
    mat.M
    Invité(e)
    Par défaut
    ????
    Avec un trivial infile de Iostream en 10 secondes cela se fait.
    Même fread du C.....

  5. #5
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Oui mais je suis un débutant dans ce langage désolé

    mais t'es sûr que ça le fait avec un infile ?

    même si le fichier est en désordre genre :

    Langue = Fr
    OS = WinXP
    Directory = C:\Programmes

    au lieu de

    OS = WinXP
    Langue = Fr
    Directory = C:\Programmes

    tu as un exemple ?

    ça m'a l'air trop simple si cela est faisable en 2 lignes avec les librairies standard du C++

    le but c'est vraiment d'isoler la valeur qu'il y a après le signe égal en spécifiant uniquement la valeur de la clé ( genre "OS", "Langue" ), ça retourne alors ce qu'il y a après le signe égal et ce quelque soit la position de la valeur au niveau ligne, ce principe existe en java mais en C++ ?

  6. #6
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut !

    Voilà un exemple (codé en live, et non testé ) qui (à priori ) charge un fichier de config, et permet d'accéder aux clés peu importe l'ordre de "déclaration".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <iostream>
    #include <map>
    #include <string>
    #include <sstream>
     
    using namespace std;
     
     
    // fichier de config = map entre une clé et une valeur
    typedef map<string,string>  ConfigFile;
     
     
     
    ConfigFile ParseIniFile(string nom)
    {
    	Config config;
    	ifstream fichier( nom.c_str() );	// le fichier de config
    	string ligne;					// pour lire ligne par ligne
     
    	// si on a pu ouvrir le fichier
    	if ( fichier )
    	{
    		// pour chaque ligne
    		while ( getline( fichier, ligne ) )
    		{	
    			// supprimer les espaces (non gérés)
    			ligne.erase( remove(ligne.begin(), ligne.end(), ' '), ligne.end() );
     
    			// lire la clé puis la valeur
    			string cle, valeur;
    			istringstream iss( ligne.c_str() );
    			getline( iss, cle, '=' );
    			getline( iss, valeur  );
     
    			// ajouter le couple {clé,valeur} à la map
    			if ( config.find(cle) != config.end() )
    			{
    				cout << "Attention, la clé " << cle << " est déjà présente" << endl;
    			}
    			else
    			{
    				config.insert( ConfigFile::value_type(cle,valeur) );
    			}
    		}
    	}
     
    	return config;
    }
     
     
     
    void main()
    {
     
    	ConfigFile config = ParseIniFile("config.txt");
     
     
    	// pour éviter 2 accès on peut stocker l'iterateur retourné par find()
    	// mais gardons les choses simples dans un premier temps :)
     
    	if ( config.find("OS") == config.end() )
    	{
    		cout << "Clé OS non présente" << endl;
    	}
    	else
    	{
    		cout << "OS = " << config["OS"] << endl;
    	}
     
    }
    Comme quoi avec les outils fournis par le C++, c'est facilement compréhensible, et assez rapide à faire
    A toi bien-sûr de consolider le code, d'ajouter les traitements d'erreur, en gros .... d'en faire une classe robuste que tu pourras réutiliser partout !
    Et regarde aussi comme l'a dit Aurelien du coté des bibliothèques comme Boost qui te proposent ce genre de choses, surement 100x mieux codées: plus robustes, modulaires, et parametrables . Mais je comprends que si tu débutes le C++ une bibliothèque comme Boost paraisse difficile d'accès (rien que l'installation, j'en ai des mauvais souvenirs ) ...

  7. #7
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Un grand merci bigquick je vais tester tout ça 8)

  8. #8
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Malheureusement ton source donne une erreur à la compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    #include <iostream>
    #include <map>
    #include <string>
    #include <sstream>
    #include <fstream>
     
    using namespace std;
     
     
    // fichier de config = map entre une clé et une valeur
    typedef map<string,string>  ConfigFile;
    ConfigFile ParseIniFile(string );
     
     
    ConfigFile ParseIniFile(string nom)
    {
       ConfigFile config;
       ifstream fichier( nom.c_str() );
       //fichier.open;   // le fichier de config
       string ligne;               // pour lire ligne par ligne
     
       // si on a pu ouvrir le fichier
       if ( fichier )
       {
          // pour chaque ligne
          while ( getline( fichier, ligne ) )
          {   
             // supprimer les espaces (non gérés)
             ligne.erase( remove(ligne.begin(), ligne.end(), ' '), ligne.end() );
     
             // lire la clé puis la valeur
             string cle, valeur;
             istringstream iss( ligne.c_str() );
             getline( iss, cle, '=' );
             getline( iss, valeur  );
     
             // ajouter le couple {clé,valeur} à la map
             if ( config.find(cle) != config.end() )
             {
                cout << "Attention, la clé " << cle << " est déjà présente" << endl;
             }
             else
             {
                config.insert( ConfigFile::value_type(cle,valeur) );
             }
          }
       }
     
       return config;
    }
     
     
     
    void main()
    {
     
       ConfigFile config = ParseIniFile("config.txt");
     
     
       // pour éviter 2 accès on peut stocker l'iterateur retourné par find()
       // mais gardons les choses simples dans un premier temps :)
     
       if ( config.find("OS") == config.end() )
       {
          cout << "Clé OS non présente" << endl;
       }
       else
       {
          cout << "OS = " << config["OS"] << endl;
       }
     
    }
    c'est la fonction remove() qui semble ne pas accepter 3 parametres


    error C2660: 'remove' : la fonction ne prend pas 3 arguments

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    1- Tu n'es pas obligé de redonner tout le code
    2- Ton problème serait-il dû à un vieux compilo ?

  10. #10
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Salut,

    ben j'ai un compilo assez récent ( visual studio 2003 )

    j'ai résolu le problème en mettant en commentaire la ligne qui pose problème

    à la place j'ai ajouté une fonction de type "trim" qui permet de supprimer les espace avant et après la chaine de caractere

  11. #11
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Est-ce que tu as bien inclus ? Desfois que le message soit du à l'absence de définition ...

    Sinon en effet un "trim" peut suffire, mais cette ligne permettait de gérer les espaces partout, comme de chaque coté du signe '='.

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    <algorithm> peut effectivement être la source du problème.

    PS: +1 à boost.program_option, qui se combine bien à boost.iostreams (?) pour filtrer les commentaires.

  13. #13
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2002
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 165
    Points : 193
    Points
    193
    Par défaut
    Ah non j'avais pas mis "algorithm" comme include, je ne connaissais pas

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cherche un équivalent PHP au IN en SQL
    Par bylka dans le forum Langage
    Réponses: 2
    Dernier message: 22/08/2008, 15h36
  2. Réponses: 1
    Dernier message: 30/11/2007, 11h52
  3. Cherche l'équivalent Linux de PathFileExists (Windows)
    Par vonemya dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 26/09/2007, 15h35
  4. Cherche l'équivalent de var_dump()
    Par MaitrePylos dans le forum Ruby
    Réponses: 4
    Dernier message: 05/09/2007, 19h17
  5. [VBA-E] Cherche codes équivalents à "Read, Data, Restore (Basic)"
    Par Brunox73 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/05/2006, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo