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 :

pb de lecture des données fichier .ini


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Points : 252
    Points
    252
    Par défaut pb de lecture des données fichier .ini
    bonjour ,

    voilà mon code :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main()
    {
     
      int const toto= get_setting_key("test.ini" , "option1" , "toto");
      printf ("\n\n\n\nplafond est : %s ",toto );
      int const tata = get_setting_key("test.ini" , "option2" , "tata");
      printf ("\nmaxCons est : %s ",tata);
     
      printf ("\n.......... apres tout traitement  ");
      printf ("\n\n\n\nplafond est : %s ",toto);
      printf ("\nmaxCons est : %s ",tata);
      }
     
     
    int get_setting_key (const char *filename,
                         const char *key,
                         const char *sub_key)
    {
     
       char s_line[256];
       int key_exist = 0;
     
       FILE *p_file = NULL;
     
       /* On test la validite des arguments */
       if (filename != NULL && key != NULL && sub_key != NULL)
       {
               /* Ouverture du fichier de configuration */
          p_file = fopen (filename, "r");
     
          if (p_file == NULL)
          {
             fprintf (stderr, "Erreur: "
                              "Impossible d'ouvrir le fichier specifie !\n");
     
    	return 0 ;
          }
     
          while (fgets (s_line, sizeof (s_line), p_file))
          {
             char *p_adr = NULL;
             /* Recherche de la section */
             if (key_exist == 0 && s_line[0] == '[')
             {
                p_adr = strtok (s_line, "[]");
                printf(" \n la clé est : %s \n",p_adr);    
                if (p_adr != NULL)
                {
                   if (strcmp (p_adr, key) == 0)
                   {
                      printf(" \n ---- la cle existe ds if  %s",p_adr); 
    		  key_exist = 1;
     
                   }
                }
             }
             else if (key_exist == 1)
             {
                p_adr = strtok (s_line, "=");
                if (p_adr != NULL)
                {  
                   if (strcmp (p_adr, sub_key) == 0)
                   {
    	          printf("\n ... subkey existe ...  \n"); 
     
                      /* On recupere l'enregistrement de la cle */
                      p_adr = strtok (NULL, "=");
                      printf(" ---- valeur tag  %s \n", p_adr);  
    		  return (int)p_adr ;
     
                   }
                }
             }
          }
       }
       else
       {
          fprintf (stderr, "Erreur: "
                           "Arguments manquants !\n");
       }
     
     
       /* Fermeture du fichier */
       fclose (p_file);
     
     
       return 0;
    }
    voilà le fichier test.ini
    [option2]
    toto= 50

    [option2]
    tata= 25
    et bien ma variable toto est mal affichée à la fin du traitement , je ne comprends pas pourkoi ? (elle s'affiche = m alors qu'au debut elle s'affiche bien 50 )
    ;-) cordialement

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par peppena
    voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                      /* On recupere l'enregistrement de la cle */
                      p_adr = strtok (NULL, "=");
                      printf(" ---- valeur tag  %s \n", p_adr);  
    		  return (int)p_adr ;
    Horrible ! Il faut convertir la chaine en valeur numérique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		  return strtol (p_adr, NULL, 10) ;
    au bas mot...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Points : 252
    Points
    252
    Par défaut
    merci ,
    meme avec cette instruction , ca ne marche pas ,
    plutot ca geneère une erreur de segmentation
    ;-) cordialement

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par peppena
    merci ,
    meme avec cette instruction , ca ne marche pas ,
    plutot ca geneère une erreur de segmentation
    Normal. Dans le main() , il faut corriger les printf()...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      printf ("\n\n\n\nplafond est : %d ",toto );
    Et puis il faut placer les fonctions selon le principe 'définir avant d'utiliser'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static f()
    {
    }
     
    main ()
    {
       f();
    }
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    407
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 407
    Points : 252
    Points
    252
    Par défaut
    non non pas dutout ça
    as tu essayé le code ?? (comme ca tu pex voire ce qu eje veux dire )
    ;-) cordialement

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ton code est voué à l'échec...

    Ta fonction retourne un int et tu retournes :

    Dans le cas où la clé n'existe pas... Comment savoir si la clé n'existe pas ou si elle vaut 0?

    Ensuite, tu ne refermes pas systématiquement le fichier ouvert.

    Enfin, le segmentation fault est dû au fait que tu ne testes pas le retour de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* On recupere l'enregistrement de la cle */
                      p_adr = strtok (NULL, "=");
    or il peut être NULL... (car tu as fait une faute de frappe dans ton .ini, t'as deux option2...)

    Enfin, la remarque d'Emmanuel est exact, ce que tu fais est un hasard par rapport à beaucoup de facteurs... Si tu veux un entier, retourne un entier et il t'as donné la façon de le faire.

    Finalement, l'utilisation correcte de strtok est difficile et les conséquences de cette fonction sont nombreuses et dangereuses... C'est une fonction à éviter pour les débutants... Pour ta défense, dans ce cas précis, elle fonctionne correctement (visiblement)...

    Jc

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

Discussions similaires

  1. [Turbo Pascal] Lecture des données d'un fichier
    Par bayangam dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 14/06/2013, 20h16
  2. Récupérer des données fichiers *.csv
    Par Fred2209 dans le forum Visual C++
    Réponses: 11
    Dernier message: 08/01/2007, 15h16
  3. Réponses: 1
    Dernier message: 29/11/2006, 12h00
  4. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 21h05
  5. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40

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