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 :

Problème de CRLF et de strcpy


Sujet :

C

  1. #21
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    En fait je conseille fortement quelque chose comme ce que j'ai écrit plus haut..

    Tu as une structure contenant tes champs de config possibles, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct MaConfigPtr {
      char    *UneValeurChaine ;
      double   UneValeurReelle ;
      int        UneValeurEntiere ;
      Boolean UneValeurBooleenne ;
    } MaConfig ;
    Dans le code tu fais une routine Lit_Config, ou tu lui passes le nom du fichier et l'adresse de la structure.

    Dans cette routine, tu appelles le lecture des paramètres :
    (ATTENTION ceci n'est qu'un exemple)

    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
     
    int Cette_Ligne_Est ( char *Ligne, char *ParamName, char *Type, void *Valeur )
    {
      ....
     
       if ( strstr ( Ligne, ParamName) == NULL )
          return 0 ;
     
       /* Lit la valeur et l'affecte au pointeur */
       .....
     
      return 1 ;   
    }
     
     
    int  Lit_Config ( char *Filename, MaConfig *Config )
    {
       int     i=0 ;
       char   Ligne[500] ;
       FILE *fp=NULL ;
     
       fp = fopen(Filename, "r");
       if ( fp == NULL )
         {
            return ERROR ;
         }
     
       while ( fgets ( Ligne, 500, fp) != NULL )
          {
              /* Ne prends pas les commentaires */
             if ( (Ligne[0] == '#') || (Ligne[0] == '/') || (strlen(Ligne) <= 1) )
                continue ;
     
             /* Et là récupère les paramètres que tu veux */
     
             if ( Cette_Ligne_Est ( Ligne, "VALEUR REELLE", "DOUBLE", 
                                           &(Config->UneValeuReelle) == 1 )
                 continue ;
     
             if ( Cette_Ligne_Est ( Ligne, "VALEUR ENTIERE", "INTEGER", 
                                           &(Config->UneValeuEntiere) == 1 )
                 continue ;
     
             if ( Cette_Ligne_Est ( Ligne, "VALEUR BOOLEENNE", "BOOLEAN", 
                                           &(Config->UneValeurBooleenne) == 1 )
                 continue ;
     
             if ( Cette_Ligne_Est ( Ligne, "VALEUR CHAINE", "CHAR", 
                                           &(Config->UneValeurChaine) == 1 )
                 continue ;
          }
     
       fclose(fp);
     
       return SUCCESS ;
    }
     
    /* Programme principal ou routine appellante */
     
    int main ( int argc, char **argv )
    {
       MaConfig  Config ;
       int           Statut = 0 ;
     
       Statut = Lit_Config ( argv[1], &Config );
     
       return Statut ;
    }
    Et voilà le tour est joué et c'est facilement maintenable. On rajoute un paramètre, il n'y a qu'à le rajouter dans les "if ( Cette_Ligne_Est ..."..


  2. #22
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Par défaut
    Citation Envoyé par crocodilex
    Ces 2 lignes ne sont pas du C.
    La j'avoue j'ai écrit n'importe quoi .....

    Bon alors j'ai écrit une fonction rapidement là :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <time.h>
     
    int get_conf(const char filename[], const char id[], char *value[])
    {
        FILE *conf_file = NULL;
        int i = 0;
        int j = 0;
        char *end_line, line[1024] = "", *temp;
     
        if((conf_file = fopen(filename, "r")) == NULL)
        {
            return -1;
        }
     
        while(fgets(line, sizeof(line), conf_file))
        {
            if(line[0] != '#' && line[0] != ';')
            {
                if((end_line = strstr(line, id)) != NULL)
                {
                    if(isspace(end_line[sizeof(id)]) || end_line[sizeof(id)] == '=')
                    {
                        while(isspace(end_line[sizeof(id) + i]) || end_line[sizeof(id) + i] == '=')
                        {
                            i++;
                        }
     
                        while(end_line[sizeof(id) + i] != '\n')
                        {
                            temp[j] = end_line[sizeof(id) + i];
                            i++, j++;
     
                        }
     
                        if((*value = malloc(sizeof(temp))) == NULL)
                        {
                            return -2;
                        }
     
                        strcpy(*value, temp);
                        return 1;
                    }
                }
            }
        }
     
        return -3;
    }
     
    int main(void)
    {
        char *value = NULL;
     
        get_conf("test.conf", "test", &value);
     
        fprintf(stdout, "%s", value);
        free(value), value = NULL;
     
        return 1;
    }
    Code test.conf : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Commentaire
    ; Encore un
     
    test =  marche  !!

    Codes d'erreur : -1 : impossible d'ouvrir le fichier, -2 : impossible de malloc, -3 : impossible de trouver ce qu'on cherche

    Pour moi ça marche assez bien sauf quand on met un espace avant un commentaire et qu'on a placé l'identifiant à chercher derrière (coincidence rare tout de même). Me reste plus qu'à améliorer pour gérer ce genre d'erreur (peut-être devrais-je utiliser une fonction du même genre que la fonction trim du PHP ?).
    La fonction est aussi case-sensitive mais ça c'est pas grave

    PS : dites moi si j'ai fait des erreurs ou s'il y a plus simple SVP

    Cordialement, Otacon

Discussions similaires

  1. problème avec strcpy(prog C sous linux)
    Par khadi8 dans le forum Débuter
    Réponses: 4
    Dernier message: 13/03/2013, 14h06
  2. Notepad++ CRLF problème
    Par morphine63 dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 07/01/2013, 17h37
  3. Réponses: 4
    Dernier message: 04/02/2010, 14h44
  4. Problème avec strcpy : mon programme plante
    Par Titi41 dans le forum Débuter
    Réponses: 4
    Dernier message: 06/11/2008, 12h02
  5. Réponses: 6
    Dernier message: 18/04/2006, 17h46

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