Невозможно назначить значения для строк при чтении данных из файла - PullRequest
0 голосов
/ 18 января 2019

У меня есть файл config.txt, в котором я храню конфигурации, необходимые для генерации некоторых записей, и я хочу прочитать значения конфигурации через код C и присвоить значения параметров некоторым переменным. Для целых чисел и чисел переменные назначаются правильно, но для строковых типов каждый раз, когда выполняется цикл, обновляются все строковые переменные, а не один конкретный.

Содержимое конфигурации. TIME_LIMIT=2 ING_IP=45.45.45.45 TIMEZONE=GMT+05:30-India

    const char* timeZone = "GMT+09:00-Tokyo";
    const char* ingIp = "null";
    int timeLimit = 0;

    char *configFileName = argv[++i];

    FILE *configFileHandle = fopen(configFileName, "r");

    char * line = NULL;

    // if (( fgets(line, 500, configFileHandle)) != NULL){
    //     puts(line);
    // }

    size_t len = 0;
    ssize_t read;

    while ((read = getline(&line, &len, configFileHandle)) != -1) {

        printf("Line: %s\n", line);
        char *parameter = strtok(line, "=");
        char *value = strtok(NULL, "=");


        char *ptr;
        if( (ptr = strchr(value, '\n')) != NULL)
            *ptr = '\0';

        if( (ptr = strchr(value, '\r')) != NULL)
            *ptr = '\0';

        if ( strcmp(parameter, "TIME_LIMIT") == 0 ) {
            timeLimit = atoi(value);
        }else if ( strcmp(parameter, "TIMEZONE") == 0 ) {
            timeZone = value;
        }else if ( strcmp(parameter, "ING_IP") == 0 ) {
            ingIp = value;
        }
    }

Результаты, которые я получаю, находятся на каждой итерации. Значение timeZone перезаписывается последним значением ingIp. Я хочу назначить ingIp = "45.45.45.45" и timeZone = "GMT + 05: 30-India". Для timeLimit значение назначается правильно.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вместо прямого назначения указателя вы должны либо объявить статические буферы и использовать strcpy с ними, либо использовать strdupне забудьте , чтобы освободить память после того, как она не нужна)

0 голосов
/ 18 января 2019
timeZone = value;

Здесь вы не копируете содержимое, а заставляете timeZone указывать на value. Таким образом, timeZone будет указывать на последнее содержимое, сохраненное в value.

Что вы можете сделать, это скопировать содержимое вместо назначения указателя.

Использование strdup.

   timeZone = strdup(value);

Или

   timeZone = malloc(strlen(value)+1);
   strcpy(timeZone, value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...