• 读取到配置文件的C语言的接口实现


    /*********************************************************************
     * Author  : Samson
     * Date    : 03/13/2015
     * Test platform:
     *              3.13.0-24-generic
     *              GNU bash, 4.3.11(1)-release 
     * *******************************************************************/

    为了完毕读取系统中的配置文件的某个key键的值。因为使用别人的库总是不爽,并且对于格式有一定的要求,那么就自己来写一个这种接口以供使用了。实现原理非常easy,通过打开配置文件,进行一行一行的读取,对照行中是否存在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/ufo/.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的值。执行结果例如以下:
    ufo@ufo:~/$ ./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/ufo/.mozilla/firefox/profiles.ini is cojs83dh.default

    配置文件的内容例如以下:
    ufo@ufo:~$ cat /home/ufo/.mozilla/firefox/profiles.ini
    [General]
    StartWithLastProfile=1

    [Profile0]
    Name=default
    IsRelative=1
    Path=cojs83dh.default
    Default=1

    405
  • 相关阅读:
    广义后缀自动机模板
    HDU 5852 Intersection is not allowed! ( 2016多校9、不相交路径的方案、LGV定理、行列式计算 )
    BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )
    WHU 583 Palindrome ( 回文自动机 && 本质不同的回文串的个数 )
    HDU 5527 Too Rich ( 15长春区域赛 A 、可贪心的凑硬币问题 )
    HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
    HDU 5544 Ba Gua Zhen ( 2015 CCPC 南阳 C、DFS+时间戳搜独立回路、线性基 )
    HDU 5734 Acperience ( 数学公式推导、一元二次方程 )
    hihocoder 1251 Today is a rainy day ( 15年北京 C、暴力 )
    HDU 5113 Black And White ( 2014 北京区预赛 B 、搜索 + 剪枝 )
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6916685.html
Copyright © 2020-2023  润新知