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 :

Utilisation de fichier ini


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut Utilisation de fichier ini
    Bonjour ... Voila je me posais une question ...

    Je voudrais utiliser un fichier .ini pour faciliter la gestion de parametre pour mon programme en C ...

    Par exemple je travaille avec une adresse IP et un Port (que je defini dans mon programme en C) ... Et donc chaque fois que je dois changer d'IP ou de port, je dois recompiler le programme avec les nouvelles valeurs. Et donc si j'utilisais un fichier ou serait stocker les valeurs a utiliser, cela serait beaucoup plus simple !

    Pour utiliser les fichier ini, j'ai vu qu'il existait des fonctions de type :
    WritePrivateProfileString
    GetPrivateProfileString
    (inclut dans windows.h) ...

    Maintenant est ce que ce systeme est portable sous linux ? Je supose que non ... Si non, quel est l'equivalent sous linux qui soit portable sous windows ?

    Merci de votre aide et j'espere avoir été assez clair concernant mon probleme !

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Ce n'est pas portable.

    Il n'y a pas de solution standard.

    Tu peux utiliser du code, qui fait tout cela très bien, que l'on trouve ici par exemple. A linker directement dans ton code, ca ne mange pas de pain.

  3. #3
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Et par hasard, il n'existe pas un autre type de fichier comme .conf ou je ne sais aps quoi ? Qui serait mieux geré par linux et windows ? tout les deux mains dans la mains ?

    Parce qu'avec ta solution, il faut que je travaille sous Linux hors je developpe sous windows pour le moment ... Mais ca doit etre portable sous linux :-(

    Donc en gros ... Soit j'utilise la librairie que tu m'as indiquée ... Soit je suis obligé d'écrire une fonction qui irait rechercher les informations que j'ai besoin dans mon fichier ou serait mes parametres ...

    C'est mal foutu

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Tu peux essayer de voir du côté de la bibliothèque C_IniFile écrite par Franck Hecht.

    Thierry

  5. #5
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut Merci
    Merci de m'avoir montré différentes bibliotheques qui me permette de gerer des fichiers de type .ini ..

    Mais je pense que dans un soucis de précision, je vais essayé d'écrire une fonction qui permet de recuperer la valeur d'un champ ... Mais au pir des cas, il me reste toujours la solution des librairie ...

    Merci encore une fois !

  6. #6
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    A l'adresse du lien que je t'ai passé il y a une implémentation sous forme d'un seul fichier. Dans tous les cas, tu n'est pas obligé d'utiliser le code en tant que bibliothèque. Tu peux inclure un fichier dans ton projet.

    Sinon, comme tu le dis, tu peux te rabattre sur un format de type xml. Personnellement, je trouve cela un peu lourd suivant l'application que tu développe, et suivant le public auquel elle est destinée (le .ini n'est pas du tout robuste aux erreurs de formatage, de saisie, etc.).

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    sinon une autre solution est le format du style des fichiers de ressources de X11.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    appli.objet.propriete = ...
    *.objet.propriete = ...
    *.propriete = ....
    valeur = ....

  8. #8
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    sinon une autre solution est le format du style des fichiers de ressources de X11.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    appli.objet.propriete = ...
    *.objet.propriete = ...
    *.propriete = ....
    valeur = ....
    C'est plus facile a gerer en C ce type de fichier ?


    Merci pour le single file ... Je prefere ca ... Je sai spas pourquoi mais j'trouve ca plus propre ...

    Sinon j'ai écris une petite fonction ...

    Est ce que le xml est vraiment mieux ? Peut etre plus facile a gerer ? Il existe peut etre des fonctions comme sous windows ?

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Cet article (en anglais, extrait de The Art of UNIX Programming) peut t'intéresser :
    Data File Metaformats
    Il détaille différents formats de stockage de texte, ainsi que leurs avantages et inconvénients...

  10. #10
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Cet article (en anglais, extrait de The Art of UNIX Programming) peut t'intéresser :
    Data File Metaformats
    Il détaille différents formats de stockage de texte, ainsi que leurs avantages et inconvénients...
    Merci beaucoup ... Je vais aller me cultiver :p

  11. #11
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Enfait dans mon cas ... Le choix du type de fichier pour des parametres n'a pas grande importance ... Puisqu'il n'existe pas des fonctions toute faite genre : GetPrivateProfileString sous Linux ...

    Donc je peux arranger mon fichier comme je veux, lui donner l'extention que je veux.

    Enfin voici le type de donnée que je dois sauver dans cette base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [Serveur]
    ip=127.0.0.1
    port=33333
     
    [Parametre]
    MaxSizePacket=14
    NbParam=10
    Il y aura peut etre 3 - 4 parametres en plus ... Donc dans mon cas, ca ne change rien ... Comme il n'y a pas beaucoup de valeur, je ne risque pas de perdre du temps a les retrouver ...

    Une bete fonction du genre :
    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
     
    char *getconf(char *name){
     
         FILE *fichier;
         char sLine[1024];
         char *sName;
         char *sValue;
     
         memset(sLine, 0x0, sizeof(sLine));
     
         // Ouvre le fichier en lecture seule
         fichier = fopen("config.ini", "r");
     
         // Si erreur ouverture fichier arret programme
         if(!fichier){
           MessageBox(NULL,CONFIG,"Erreur ouverture fichier : fichier de config !",MB_OK|MB_ICONERROR);
           step = 3;
         }
     
         // On boucle ligne par ligne jusqu'a la fin du fichier
         while(fgets(sLine, (int) sizeof sLine, fichier)){
           if(strchr(sLine, '=')){
             sName = sLine;
             sprintf(strchr(sName, '='), "%s", "\0");
     
             if(!strcmp(sName, name)){
               sValue = sName+strlen(sName)+1;
     
             }else MessageBox(NULL,"Parametre non trouve.\nVerifiez le fichier config.ini",name,MB_OK|MB_ICONERROR);
           }
         }
         fclose(fichier);
         free(sName);
         sName = NULL;
         return(sValue);
    }
    Fera l'affaire ! En tout cas merci pour vos indications, conseilles et prise de position sur mon post. Merci a vous !

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    ATTENTION cette fonction retourne l'adresse d'un tableau local.
    (de plus, le pointeur "name" devrait être const, et ton sprintf me parait une façon bien compliquée de faire *strchr(sName, '=') = '\0'...)

  13. #13
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf(strchr(sName, '='), "%s", "\0");
    Sert enfait a mettre i, \0 a l'endroit ou se trouve le = histoire d'avoir le mot tout seul

    Comme ca après je le compare avec le mot recherché

    Et donc tu me conseille de faire plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *strchr(sName, '=') = "\0";
    Et tu voudrais que je renvoie quoi ? A part la chaine de caractere trouvée ?
    L'adresse du pointeur plutot que la chaine ?

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    tu voudrais que je renvoie quoi ? A part la chaine de caractere trouvée ?
    L'adresse du pointeur plutot que la chaine ?
    Retourner strdup() de cette chaîne, et penser à faire un free() dans la fonction appelante.

    Et ta variable step devrait avoir un nom qui montre plus explicitement qu'elle est globale (du genre g_step).

  15. #15
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Je n'ai jamais utiliser de strdup, je vais allez voir ...
    Hum ca renvoie une chaine de charactere duplicée ...
    Donc je peux (doit) la free ...

    Mais comment je peux free quelque chose dans une fonction si j'ai deja fais un return ?

    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
     
    char *getconf(const char *name){
     
         FILE *fichier;
         char sLine[1024];
         char *sName = NULL;
         char *sValue = NULL;
     
         memset(sLine, 0x0, sizeof(sLine));
     
         // Ouvre le fichier en lecture seule
         fichier = fopen("config.ini", "r");
     
         // Si erreur ouverture fichier arret programme
         if(!fichier){
           MessageBox(NULL,CONFIG,"Erreur ouverture fichier : fichier de config !",MB_OK|MB_ICONERROR);
           step = 3;
         }
     
         // On boucle ligne par ligne jusqu'a la fin du fichier
         while(fgets(sLine, (int)sizeof sLine, fichier)){
           if(strchr(sLine, '=')){
             sName = sLine;
     
             *strchr(sName, '=') = "\0";
     
             if(!strcmp(sName, name)) sValue = sName+strlen(sName)+1;
           }
         }
         if(sValue == NULL){
           MessageBox(NULL,"Parametre non trouve.\nVerifiez le fichier config.ini",name,MB_OK|MB_ICONERROR);
           step = 3;
         }
         else{
         fclose(fichier);
         free(sName);
         sName = NULL;
         return(strdup(sValue));
         free(sValue);
         sValue = NULL;
         }
    }
    Et merci pour le conseille de mettre les variables globales avec un signe significatif

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par nuFox
    Mais comment je peux free quelque chose dans une fonction si j'ai deja fais un return ?
    Citation Envoyé par Médinoc Voir le message
    Retourner strdup() de cette chaîne, et penser à faire un free() dans la fonction appelante.

  17. #17
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    oups ... Désolé ... :$

  18. #18
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Bon hum ...

    Il ne retouve plus les mots dans mon fichier sniff sniff ... Je pense que c'est du a la ligne ou j'écris le \0 dans ma chaine sName ...

    Mais pour que vous puissiez bien vous rendre compte de ce que j'attend voici les bouts de code :

    Voici la fonction:
    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
     
    char *getconf(const char *name){
     
         FILE *fichier;
         char sLine[1024];
         char *sName = NULL;
         char *sValue = NULL;
     
         memset(sLine, 0x0, sizeof(sLine));
     
         // Ouvre le fichier en lecture seule
         fichier = fopen("config.ini", "r");
     
         // Si erreur ouverture fichier arret programme
         if(!fichier){
           MessageBox(NULL,CONFIG,"Erreur ouverture fichier : fichier de config !",MB_OK|MB_ICONERROR);
           step = 3;
         }
     
         // On boucle ligne par ligne jusqu'a la fin du fichier
         while(fgets(sLine, (int)sizeof sLine, fichier) && sValue == NULL){
           if(strchr(sLine, '=')){
             sName = sLine;
             *strchr(sName, '=') = "\0";
             if(!strcmp(sName, name)) sValue = sName+strlen(sName)+1;
           }
         }
         if(sValue == NULL){
           MessageBox(NULL,"Parametre non trouve.\nVerifiez le fichier config.ini",name,MB_OK|MB_ICONERROR);
           step = 3;
         }
         else{
         fclose(fichier);
         free(sName);
         sName = NULL;
         return(strdup(sValue));
         }
    }
    Voici la partie ou j'appelle la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char *ip_adr;
    char *port;
      ip_adr = getconf("ip");
      port = getconf("port");
      infoServeur.sin_family = AF_INET;
      infoServeur.sin_addr.s_addr = inet_addr(ip_adr); // Indiquez l'adresse IP de votre serveur  
      infoServeur.sin_port = htons((unsigned short)port);              // Port écouté du serveur 
     
      free(ip_adr);
      ip_adr = NULL;
      free(port);
      port = NULL;

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Pourquoi fais-tu un free(sName), alors que sName pointe sur un buffer local ?

  20. #20
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut
    Parce que chaque fois que je vosi un pointeur que j'utilise plus je le free ... C'est mal ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2014, 11h05
  2. Utilisation TIniFiles (fichier ini)
    Par beni34 dans le forum Débuter
    Réponses: 11
    Dernier message: 14/04/2009, 18h23
  3. [VB.Net][Fichier ini] utilisation des API
    Par DonF dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/03/2009, 14h32
  4. Pinguer plusieurs Ports en utilisant un fichier INI
    Par fthdz dans le forum Langage
    Réponses: 16
    Dernier message: 14/11/2007, 13h26
  5. Utiliser un fichier ini
    Par Sytchev3 dans le forum Langage
    Réponses: 3
    Dernier message: 14/08/2007, 17h48

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