Лучший способ прочитать имя имя пары в c - PullRequest
0 голосов
/ 29 марта 2019

Каков наилучший способ прочитать имя и его значение из файла конфигурации в c программирования?

Пример файла конфигурации:

NAME=xxxx
AGE=44
DOB=mmddyyyy
WORK=zzzz

Это код, который я использую. Это работает. Но я хотел бы знать, есть ли лучший способ.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int getValue(char *line, char* name, char value[])
{
    char* pch = NULL;
    char* token = NULL;
    pch = strstr(line, name);

    if(pch)
    {
        token = strtok(pch, "=");

        while (token != NULL)
        {
            pch = token;
            token = strtok(NULL, "=");
        }
        pch[strcspn ( pch, "\n" )] = '\0';
        strcpy(value,pch);
        return 1;
    }
    return 0;
}

int main()
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;
    char value[100];
    int ret = 0;

    fp = fopen("test.txt", "r");
    if (fp == NULL)
    {
        printf ("Cannot open file \n");
        return -1;
    }

    while ((read = getline(&line, &len, fp)) != -1)
    {
        ret = getValue(line,"NAME",value);
        if (ret)
        {
            printf("NAME is %s\n", value);
        }

        ret = getValue(line,"AGE",value);
        if (ret)
        {
            printf("AGE is %s\n", value);
        }
    }

    free(line);
    fclose(fp);
    return 0;
}

Я также был бы рад узнать, есть ли какие-либо проблемы с этим кодом.

1 Ответ

1 голос
/ 29 марта 2019

Есть несколько проблем

  • Когда файл похож на ниже, ваш синтаксический анализ неверен.она будет найдена, пока эта строка находится в line, независимо от того, находится ли она в значении или части ключа.
NAMEX=xxxx
AGEX=44
DOB=mmddyyyyAGE
WORK=zzzzAGE
  • Использовать strtok line содержимое будет изменено.На самом деле, когда вы вызываете getValue во второй раз, содержимое line отличается от файла.
AGE=NAMEzzzz=1=2
  • От производительности выможет напрямую использовать line подстроку, нет необходимости выводить

Рекомендуется сначала проанализировать ключ и значение, а затем сравнить ключ, который вы ищете, несколько раз.код ниже только для справки

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char *trim(char *str)
{
    char *start = str;
    char *end = str + strlen(str);

    while(*start && isspace(*start))
        start++;

    while(end > start && isspace(*(end - 1)))
        end--;

    *end = '\0';
    return start;
}

int parse_line(char *line, char **key, char **value)
{
    char *ptr = strchr(line, '=');
    if (ptr == NULL)
        return -1;

    *ptr++ = '\0';
    *key = trim(line);
    *value = trim(ptr);

    return 0;
}

int main()
{
    FILE *fp;
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    char *key, *value;

    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        printf ("Cannot open file \n");
        return -1;
    }

    while ((read = getline(&line, &len, fp)) != -1) {
        if (parse_line(line, &key, &value))
            continue;

        if (strcmp(key, "NAME") == 0) {
            printf("NAME is %s\n", value);
        } else if (strcmp(key, "AGE") == 0) {
            printf("AGE is %s\n", value);
        }
    }

    free(line);
    fclose(fp);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...