zoukankan      html  css  js  c++  java
  • 读取到配置文件的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
  • 相关阅读:
    projecthashing
    Windows 环境 gRPC环境搭建
    gitlab 适配性问题
    对 Golang 简洁架构实战的理解,以及 Golang 开源项目包定义的解惑
    Golang 关于百分比,小数点为数的问题
    Golang net/http 库日常 http 请求操作
    解决mysql建立事件时出现 “Cannot proceed because system tables used by Event Scheduler were found damaged at server start” 的错误
    如何在Linux安装Wine
    Public key for *.rpm is not installed
    从 IClassFactory 为 CLSID 为 {AA40D1D6CAEF4A56B9BBD0D3DC976BA2} 的 COM 组件创建实例失败,原因是出现以下错误: c001f011。
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6916685.html
Copyright © 2011-2022 走看看