Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 读取到配置文件的C语言的接口实现

为了完成读取系统中的配置文件的某个key键的值,由于使用别人的库总是不爽,而且对于格式有一定的要求,那么就自己来写一个这样的接口以供使用了。实现原理很简单,通过打开配置文件,进行一行一行的读取,对比行中是否存在key串且此key串的下一个字符是否为"=",若是,则得到"="号之后的值。注意:此实现方法只适用于key=value这样的配置格式,而不是很多配置文件的key="value"的格式。以下即是此接口的实现及测试代码:#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int get_conf_value(char *file_path, char *key_name, char *value)
{
    FILE *fp = NULL;
        char *line = NULL, *substr = NULL;
        size_t len = 0, tlen = 0;
        ssize_t read = 0;
   
    if(file_path == NULL || key_name == NULL || value == NULL)
    {
        printf("paramer is invaild! ");
        return -1;
    }
        fp = fopen(file_path, "r");
        if (fp == NULL)
    {
        printf("open config file is error! ");
        return -1;
    }        while ((read = getline(&line, &len, fp)) != -1)
    {
        substr = strstr(line, key_name);
        if(substr == NULL)
        {
            continue;
        }
        else
        {
            tlen = strlen(key_name);
            if(line[tlen] == "=")
            {
                strncpy(value, &line[tlen+1], len-tlen+1);
                printf("config file format is invaild tlen is %d len is %d ", tlen, len);
                tlen = strlen(value);
                printf("get value is %s tlen is %d ", value, tlen);
                //replace enter key
                *(value+tlen-1) = "";
                break;
            }
            else
            {
                printf("config file format is invaild tlen is %d len is %d ", tlen, len);
                fclose(fp);
                return -2;
            }
        }
        }
    if(substr == NULL)
    {
        printf("key: %s is not in config file! ", key_name);
        fclose(fp);
        return -1;
    }        free(line);
    fclose(fp);
    return 0;
}int main()
{
    char getva[128] = {0};
    char pathname_key[] = "Path";
    char profilename[] = "/home/linuxidc/.mozilla/firefox/profiles.ini";
    int ret = get_conf_value(profilename, pathname_key, getva);
    if(ret == 0)
        printf("get pathname_key"s value from profile:%s is %s ", profilename, getva);
    return ret;
}其中profilename是firefox的配置文件,获取key:Path的值。运行结果如下:
linuxidc@linuxidc:~/$ ./a.out
config file format is invaild tlen is 4 len is 120
get value is cojs83dh.default
 tlen is 17
get pathname_key"s value from profile:/home/linuxidc/.mozilla/firefox/profiles.ini is cojs83dh.default配置文件的内容如下:
linuxidc@linuxidc:~$ cat /home/linuxidc/.mozilla/firefox/profiles.ini
[General]
StartWithLastProfile=1[Profile0]
Name=default
IsRelative=1
Path=cojs83dh.default
Default=1
405/*********************************************************************
 * Author  : Samson
 * Date    : 03/13/2015
 * Test platform:
 *              3.13.0-24-generic
 *              GNU bash, 4.3.11(1)-release
 * *******************************************************************/本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-03/115172.htm