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 :

fichier de config :: recuperer les parametres.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut fichier de config :: recuperer les parametres.
    je me suis lancé dans le codage d'un logiciel (un eggdrop-like) qui necessite un fichier de configuration.

    pour recuperer ces parametres, j'utilise cette 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
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define LINESIZE 128
    #define MAXLEN 5
    #define NBVAR 8
     
    typedef struct
    {
      char *port_c;
      char *server_c;
      char *nick;
      char *chann;
      char *ident;
      char *realname;
      char *serv_pass;
      char *chan_pass;
    } cfgstruct;
     
    int rtrcfg (cfgstruct * cfg);
     
    int
    main()
    {
      int cfgctrl;
      cfgstruct cfgparms;
      memset (&cfgparms, 0, sizeof (cfgparms));
      cfgctrl = rtrcfg(&cfgparms);
    return EXIT_SUCCESS;
    }
     
    int
    rtrcfg (cfgstruct * cfg)
    {
      char varlist[NBVAR][9] =
        { "port", "server", "nick", "channel", "ident", "realname", "serv_pass",
        "chan_pass"
      };
     
      FILE *cfg_file;
      cfg_file = fopen ("dotcfg.dat", "r");
     
      if (cfg_file != NULL)
        {
          char *line = NULL;
          char *lgerline = NULL;
          char *p = NULL;
          int ctr = 1;
          int i;
          line = malloc (ctr * LINESIZE);
          fpos_t laspos;
          memset (&laspos, 0, sizeof (laspos));
          while (fgets (line, ctr * LINESIZE, cfg_file) != NULL)
    	{
    	  p = strchr (line, '\n');
    	  if (p != NULL)
    	    {
    	      *p = 0;
    	      if (fgetpos (cfg_file, &laspos) != 0)
    		perror ("file pos!");
    	    }
    	  else
    	    {
    	      printf ("reallocating some memory !\n");
    	      if (ctr < MAXLEN)
    		{
    		  ctr++;
    		  lgerline = realloc (line, ctr * LINESIZE);
    		  if (lgerline != NULL)
    		    {
    		      line = lgerline;
    		      if (fsetpos (cfg_file, &laspos) != 0)
    			perror ("setpos failed");
    		    }
    		  else
    		    perror ("couldn't alloc enough memory to line func");
    		}
    	      else
    		printf ("line too long !\n");
    	    }
    	  p = strchr (line, '=');
    	  if (p != NULL)
    	    {
    	      char *qualif = malloc (p - line);
    	      char *param = malloc (strlen (p) - 1);
    	      if (qualif != NULL && param != NULL);
    	      {
    		strncpy (qualif, line, p - line);
    		strncpy (param, p + 1, strlen (p) - 1);
    		printf ("%s %s \n", qualif, param);
    		for (i = 0; i < NBVAR; i++)
    		  {
    		    if (strncmp (varlist[i], qualif, strlen (qualif) - 1) ==
    			0)
    		      {
    			switch (i)
    			  {
    			  case 0:
    			    cfg->port_c = param;
    			  i = NBVAR;
    			    break;
    			  case 1:
    			    cfg->server_c = param;
    			  i = NBVAR;
    			    break;
    			  case 2:
    			    cfg->nick = param;
    			  i = NBVAR;
    			    break;
    			  case 3:
    			    cfg->chann = param;
    			  i = NBVAR;
    			    break;
    			  case 4:
    			    cfg->ident = param;
    			  i = NBVAR;
    			    break;
    			  case 5:
    			    cfg->realname = param;
    			  i = NBVAR;
    			    break;
    			  case 6:
    			    cfg->serv_pass = param;
    			  i = NBVAR;
    			    break;
    			  case 7:
    			    cfg->chan_pass = param;
    			  i = NBVAR;
    			    break;
    			  }
    		      }
    		  }
    	      }
    	    }
    	}
    	free(line);
    //needed: test if everything has been allocated ...
        }
    return 1;
    }
    le but est de faire un fichier de config assez facile a faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [irc]
    server=irc.quakenet.org
    port=6667
    channel=#bot
    nick=ircybotty
    ident=frisky
    realname=Ebola's bot
    farfelu=pouet
    un fichier de config ou l'utilisateur puisse oublier des choses (on mettras les parametres a des valeurs par defaut), ou il puisse mettre des parametres farfelu ... des commentaires sans respecter aucune syntaxe ... (tant qu'il n'y as pas de '=')

    breffe, mon probleme :
    le switch // case ne me conviens pas, j'aimerais trouver autre chose ... (je trouve pas :X) => lourd de faire evoluer le code pour rajouter par exemple 10 parametres !
    je ne vois pas, dans l'etat actuel, comment free param et qualif si le parametre ne correspond a rien et est en derniere position (param => farfelu et qualif => pouet :: ne seras jamais free !): j'ai pensé utilisé un "flag" pour dire affecté (a un element de ma struct) ou pas et donc faire un free si non affecté.

    j'ai entendu parlé de hashtables :: mais j'ai rien compris du tout. (mais alors RIEN du tout)
    est-ce que ces fameuses hashtables pourrait m'aider dans ce cas?

    je me relis ... mais je sais pas si je suis bien clair ... moi je me comprend !
    j'espere que vous aussi
    merci d'avoir lut jusque ici en tout cas !

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Salut
    Sous Windows (et sans doute aussi sous Unix/Linux) , il existe une famille de fonctions de gestion de profil (Get/Write)PrivateProfileXXXX qui font tout celà très bien.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    je ne trouve pas l'equivalent de ces fonctions de gestion de profil sous Linux.
    je code dans mon temps libre et aimerais apprendre des choses ... notement une bonne methode pour gerer des fichiers de configuration de maniere portable.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Dark_Ebola
    je ne trouve pas l'equivalent de ces fonctions de gestion de profil sous Linux.
    je code dans mon temps libre et aimerais apprendre des choses ... notement une bonne methode pour gerer des fichiers de configuration de maniere portable.
    http://emmanuel-delahaye.developpez.com/clib.htm
    Module INI

    Seule la partie 'lecture' est codée (pour l'écriture du fichier de config, j'utilise un éditeur de texte, c'est l'interêt de travailler en format texte...).

    Tu peux t'en inspirer pour développer la partie 'écriture'.

    Pose des questions si tu ne comprends pas...

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Sinon tu as la GLib qui propose aussi un parser et puis c'est portable: Key-value file parser j'en ai même créé un exemple d'utilisation si tu veut !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    je vais me pencher la dessus pour essayer de comprendre comment tout cela marche ... (une solution toute faite n'est pas interressante : ce qui m'interresse c'est de savoir)
    il faut que je me secoue la neuronne

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Dark_Ebola
    je vais me pencher la dessus pour essayer de comprendre comment tout cela marche ... (une solution toute faite n'est pas interressante : ce qui m'interresse c'est de savoir)
    il faut que je me secoue la neuronne
    Hummm ok, c'est sûr c'est mieux d'apprendre à comment le faire ... donc dans ce cas une fonction est ton amie: strtok ... dans string.h
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/02/2008, 09h51
  2. recuperer les parametres
    Par opensource dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 15/05/2007, 16h47
  3. Recuperer les parametres d'un TDATABASE
    Par tryonyco dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/02/2007, 23h40
  4. [html] recuperer les parametre de la requete
    Par zeroox dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 21/02/2006, 10h56
  5. Réponses: 3
    Dernier message: 15/11/2005, 23h52

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