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 :

Extraction d'informations depuis un fichier de données en C [Tutoriel]


Sujet :

C

  1. #1
    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 : 44
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : janvier 2004
    Messages : 6 951
    Points : 12 449
    Points
    12 449
    Par défaut Extraction d'informations depuis un fichier de données en C
    http://franckh.developpez.com/articles/c-ansi/parsing/

    Dans certains projets, il peut être nécessaire d'extraire des données depuis un fichier. Que ce soit une liste de contacts, des données pour remplir des tableaux ou pour des tableurs, des options utilisateurs, etc... Ce tutoriel va vous expliquer les bases pour lire différents formats et en extraire les données.
    Vous pouvez laisser un commentaire pour cet article à la suite.


    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 !

  2. #2
    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 : 41
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Une remarque : adresse en anglais a deux 'd' ;-)

    Ensuite, je pense que pour la première partie, un code plus générique est peut-être mieux non ?

    Jc

    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
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
     
    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    #define BEGIN        '{'
    #define SEP          ':'
    #define BUF_SIZE     128
    #define FILENAME     "perso.txt"
    #define END          '}'
     
    typedef struct
    {
       char *   name;
       char *   address;
       char *   phone;
       int      age;
    }
    contact_infos;
     
     
    typedef enum
    {
       NAME,
       AGE,
       ADDRESS,
       PHONE,
     
       NB_TAG
    }
    contact_tags;
     
    static const char *fields[] = { "name", "age", "address", "phone" };
     
    static char * str_dup (const char * str)
    {
       char * dup = NULL;
     
     
       if (str != NULL)
       {
          size_t size = strlen (str) + 1;
          dup = malloc (size);
     
          if (dup != NULL)
          {
             memcpy (dup, str, size);
          }
       }
     
     
       return dup;
    }
     
     
    static void str_finalize (char * str)
    {
       char * p = strchr (str, '\n');
     
       if (p != NULL)
       {
          *p = 0;
       }
    }
     
    static void contact_infos_free (contact_infos ** p)
    {
       if (p != NULL && *p != NULL)
       {
          free ((*p)->name);
          free ((*p)->address);
          free ((*p)->phone);
     
          free (*p);
          *p = NULL;
       }
    }
     
    static void get (contact_infos * p, char * s, contact_tags tag)
    {
       char     buff  [BUF_SIZE];
     
       if (s != NULL)
       {
          switch (tag)
          {
             case NAME:
             {
                p->name = str_dup (s);
             }
             case AGE:
             {
                p->age = strtol (s, NULL, 10);
             }
             break;
     
             case ADDRESS:
             {
                p->address = str_dup (s);
             }
             break;
     
             case PHONE:
             {
                p->phone = str_dup (s);
             }
             break;
     
             default:
                break;
          }
       }
    }
     
    static void fillInfo (contact_infos *info, char *buff)
    {
       char *   s     = NULL;
       int i;
     
       s = strchr (buff, SEP);
     
       if (s != NULL)
       {
           *s = '\0';
     
           i = 0;
           while (buff[i] != '\0' && (buff[i] == ' ') || (buff[i] == '\t'))
               i++;
           buff += i;
     
           for (i=0; i < NB_TAG; i++)
           {
               if (strcmp (buff, fields[i]) == 0)
               {
                   s++;
                   str_finalize (s);
                   get (info, s, i);
                   break;
               }
           }
       }
    }
     
    static contact_infos * get_info (const char * contact_name)
    {
       contact_infos  *  ret = NULL;
       contact_infos  tmp;
       FILE           *  file     = NULL;
       char              buff     [BUF_SIZE];
       int               opened   = 0;
     
       file = fopen (FILENAME, "r");
     
       if (file != NULL)
       {
          while ((fgets (buff, BUF_SIZE, file) != NULL))
          {
             if (buff[0] == BEGIN)
             {
                 memset (&tmp, 0, sizeof (tmp));
     
                 while ((fgets (buff, BUF_SIZE, file) != NULL))
                 {
                     fillInfo (&tmp, buff);
                     if (buff[0] == END)
                     {
                         break;
                     }
                 }
     
                 if (strcmp (contact_name, tmp.name) == 0)
                 {
                     ret = malloc (sizeof (*ret));
                     memcpy (ret, &tmp, sizeof (tmp));
                     break;
                 }
     
                 free (tmp.name);
                 free (tmp.address);
                 free (tmp.phone);
             }
          }
          fclose (file);
       }
     
       return ret;
    }
     
     
     
    int main (void)
    {
       contact_infos * info = get_info ("Franck.H");
     
       printf (
          "%s\n%d\n%s\n%s\n\n",
          info->name, info->age, info->address, info->phone
       );
     
       contact_infos_free (& info);
     
       return EXIT_SUCCESS;
    }

  3. #3
    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 : 44
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : janvier 2004
    Messages : 6 951
    Points : 12 449
    Points
    12 449
    Par défaut
    Oui tout à fait, enfin j'ai bien précisé qu'on pouvais faire mieux que celle que j'ai montré
    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 !

  4. #4
    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 : 41
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : décembre 2005
    Messages : 5 121
    Points : 11 857
    Points
    11 857
    Par défaut
    Oh je sais. Mais j'avais un peu de temps :-)

    C'est tellement rare que du coup, j'en ai profité ;-)
    Jc

  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 : 44
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : janvier 2004
    Messages : 6 951
    Points : 12 449
    Points
    12 449
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Oh je sais. Mais j'avais un peu de temps :-)

    C'est tellement rare que du coup, j'en ai profité ;-)
    Jc
    Oui
    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 !

Discussions similaires

  1. Extraction d'information depuis fichier publisher
    Par redcurve dans le forum Développement Office System
    Réponses: 0
    Dernier message: 12/12/2012, 09h01
  2. extraction des attributs depuis un fichier XML
    Par pacomou dans le forum kettle/PDI
    Réponses: 4
    Dernier message: 12/12/2011, 12h51
  3. Extraire certaines informations depuis un fichier
    Par maxxou91 dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2006, 20h56

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