使用libconfig在C中读取配置文件

时间:2014-07-29 15:25:53

标签: c config-files libconfig

我为配置文件中的选项定义了一个结构,并在“config.h”文件中指定了这个结构的指针,我使用libconfig读取配置文件,并在函数get_config()中设置值,该值在文件“config.c中定义”。在main函数中,我初始化指向结构的指针并调用get_config()函数。 libconfig运行良好并正确打印结构字段的值,但是当我在主函数中打印相同的字段时,它们的值不正确!

“的config.h”

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

typedef struct
{
    int buffer_size;
    const char * DBusername;
    const char * DBpassword;
}conf;

conf *config;

int get_config();

“config.c”

#include "config.h"


int get_config()
{
    config_t cfg;
    config_setting_t *setting;

    config_init(&cfg);

    /* Read the file. If there is an error, report it and exit. */
    if(! config_read_file(&cfg, "config.cfg"))
    {
        fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
            config_error_line(&cfg), config_error_text(&cfg));
        config_destroy(&cfg);
        return(EXIT_FAILURE);
    }

    if(config_lookup_int(&cfg, "buffersize", &config->buffer_size))
        printf("buffersize: %d\n\n", config->buffer_size);
    else
        fprintf(stderr, "No 'buffersize' setting in configuration file.\n");

    if(config_lookup_string(&cfg, "DBusername", &config->DBusername))
        printf("DBusername: %s\n\n", config->DBusername);
    else
        fprintf(stderr, "No 'DBusername' setting in configuration file.\n");

    if(config_lookup_string(&cfg, "DBpassword", &config->DBpassword))
        printf("DBpassword: %s\n\n", config->DBpassword);
    else
        fprintf(stderr, "No 'DBpassword' setting in configuration file.\n");

    config_destroy(&cfg);

    return(EXIT_SUCCESS);

}

“store.c”

int main(){
    config = (conf*) malloc(sizeof(conf));
    if(get_config() == EXIT_FAILURE)
        return 0;

    printf("\n%s", config->DBusername);
    printf("\n%s", config->DBpassword);
    printf("\n%d", config->buffer_size);
}

2 个答案:

答案 0 :(得分:2)

问题是因为在结构中定义了char *。我将char *更改为char [],问题解决了! :)

答案 1 :(得分:0)

我为配置文件中的选项定义了一个结构,并在&#34; config.h&#34;中定义了一个指向此结构的指针。档案......

该声明让我想知道配置文件是什么。即它是.c还是.h?其他文件的可见性是什么?

您的问题可能是因为结构的范围(visibilty)未提供给main()函数所在的文件。 #include定义结构的.h,并确保该结构的实例化具有全局范围,或者在main()中创建实例化

这种文件配置将提供对.h中定义的结构主体的可见性:

某些文件中的

typedef struct 
{
  int membername;
} A_STRUCT;

extern A_STRUCT a

在someotherFile.c

#include "somefile.h"

A_STRUCT a = {3};  //global copy of the struct, with assignment

int main(void)
{
    printf("%d", a.membername);
    return 0;
}