2010-11-20 26 views
0

gcc 4.5.1 c89lecture en lignes de texte à partir du fichier

J'utilise le code suivant pour lire une ligne de texte à partir d'un fichier de configuration. Le fichier de configuration est petit pour l'instant, va grandir avec de nouveaux champs à ajouter. Et je peux à peu près concevoir ce que le fichier de configuration me ressemblera. Donc, je l'ai fait de la façon suivante:

config.cfg

# Configuration file to be loaded 

# protocol to use either ISDN, SIP, 
protocol: ISDN 

# run application in the following mode, makecall or waitcall 
mode: makecall 

J'ai utilisé le côlon comme un moyen de rechercher le type de configuration qui sera nécessaire. Je me demandais s'il y avait une meilleure façon de faire cela?

Mon code, je l'ai utilisé est la suivante:

static int load_config(FILE *fp) 
{ 
    char line_read[LINE_SIZE] = {0}; 
    char *type = NULL; 
    char field[LINE_SIZE] = {0}; 
    char *carriage_return = NULL; 

    /* Read each line */ 
    while(fgets(line_read, LINE_SIZE, fp) != NULL) { 
     if(line_read != NULL) { 
      /* Ignore any hashs and blank lines */ 
      if((line_read[0] != '#') && (strlen(line_read) > 1)) { 
       /* I don't like the carriage return, so remove it. */ 
       carriage_return = strrchr(line_read, '\n'); 
       if(carriage_return != NULL) { 
        /* carriage return found so relace with a null */ 
        *carriage_return = '\0'; 
       } 

       /* Parse line_read to extract the field name i.e. protocol, mode, etc */ 
       parse_string(field, line_read); 
       if(field != NULL) { 
        type = strchr(line_read, ':'); 
        type+=2; /* Point to the first character after the space */ 

        if(strcmp("protocol", field) == 0) { 
         /* Check the protocol type */ 
         printf("protocol [ %s ]\n", type); 
        } 
        else if (strcmp("mode", field) == 0) { 
         /* Check the mode type */ 
         printf("mode [ %s ]\n", type); 
        } 
       } 
      } 
     } 
    } 

    return TRUE; 
} 

/* Extract the field name for the read in line from the configuration file. */ 
static void parse_string(char *dest, const char *string) 
{ 
    /* Copy string up to the colon to determine configuration type */ 
    while(*string != ':') { 
     *dest++ = *string++; 
    } 
    /* Insert nul terminator */ 
    *dest = '\0'; 
} 

Répondre

1

devrait être plus facile:

static int load_config(FILE *fp) 
{ 
    int r=0; 
    char line[LINE_SIZE], field[LINE_SIZE], type[LINE_SIZE], dummy[LINE_SIZE]; 

    /* Read each line */ 
    while(fgets(line, LINE_SIZE, fp)) 
    { 
    if(strchr(line,'\n')) *strchr(line,'\n')=0; 
    if(3==sscanf(line,"%[^: ]%[: ]%s,field,dummy,type)) 
     ++r,printf("\n %s [ %s ]",field,type); 
    } 
    return r; 
} 
1

Si vous pouvez concevoir ce que le fichier de configuration ressemblera j'irais pour XML, l'analyse syntaxique avec Expat. C'est indolore.

1

La réponse standard au problème d'analyse simple est d'utiliser lex et yacc.

Cependant, comme vous avez la liberté de définir la forme du fichier de configuration, vous devez utiliser l'une des nombreuses bibliothèques qui implémentent divers formats de fichiers de configuration, et utilisez-la.

http://www.google.com/search?q=configuration+file+parser

http://www.nongnu.org/confuse/ par exemple, semble couvrir adéquatement vos besoins, mais jetez un oeil à d'autres options qui pourraient être plus simples aussi bien.

+0

Merci, je vais les regarder. En attendant, pouvez-vous voir des problèmes potentiels avec mon code source. – ant2009

+0

La question était C89, lex, yacc, ... ne sont pas des parties de cela. – user411313