/*********************************************************************
 * 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!\n");

        return -1;

    }

        fp = fopen(file_path, "r");

        if (fp == NULL)

    {

        printf("open config file is error!\n");

        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\n", tlen, len);

                tlen = strlen(value);

                printf("get value is %s tlen is %d\n", value, tlen);

                //replace enter key

                *(value+tlen-1) = '\0';

                break;

            }

            else

            {

                printf("config file format is invaild tlen is %d len is %d\n", tlen, len);

                fclose(fp);

                return -2;

            }

        }

        }

    if(substr == NULL)

    {

        printf("key: %s is not in config file!\n", 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\n", 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

读取到配置文件的C语言的接口实现的更多相关文章

  1. Python读取ini配置文件(接口自动测试必备)

    前言 大家应该接触过.ini格式的配置文件.配置文件就是把一些配置相关信息提取出去来进行单独管理,如果以后有变动只需改配置文件,无需修改代码. 特别是后续做自动化的测试,代码和数据分享,进行管理.比如 ...

  2. SpringBoot中如何优雅的读取yml配置文件?

    YAML是一种简洁的非标记语言,以数据为中心,使用空白.缩进.分行组织数据,从而使得表示更加简洁易读.本文介绍下YAML的语法和SpringBoot读取该类型配置文件的过程. 本文目录 一.YAML基 ...

  3. java读取properties配置文件信息

    一.Java Properties类 Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置 ...

  4. Java读取Properties配置文件

    1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,使用键值对的形式来保存属性集.不过Properties的键和值都是字符串 ...

  5. java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...

  6. 依赖注入之setter注入---只需修改配置,电脑就可以安装不同的打印机;读取properties配置文件并创建实例;实现不采用new的方式直接实例化对象

    1.项目截图 2.黑白打印机类 package com.example.demo.printer; public class GrayPrinter implements Printer{ @Over ...

  7. 读取HeidiSQL 配置文件中的密码

    读取HeidiSQL 配置文件中的密码 2017-1-21 5:42:01 codegay HeidiSQL是一款开源的SQL管理工具,用管理MYSQL,MSSQL 等数据库, 很多管理工具都会把密码 ...

  8. R语言数据接口

    R语言数据接口 R语言处理的数据一般从外部导入,因此需要数据接口来读取各种格式化的数据 CSV # 获得data是一个数据帧 data = read.csv("input.csv" ...

  9. 【转载】java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...

随机推荐

  1. 【POJ3255/洛谷2865】[Usaco2006 Nov]路障Roadblocks(次短路)

    题目: POJ3255 洛谷2865 分析: 这道题第一眼看上去有点懵-- 不过既然要求次短路,那估计跟最短路有点关系,所以就拿着优先队列优化的Dijkstra乱搞,搞着搞着就通了. 开两个数组:\( ...

  2. 【洛谷2982】[Usaco2010 Feb]慢下来Slowdown(dfs序+线段树)

    题目: 洛谷2982 分析: 这道题最重要的是想明白一点:牛\(i\)走到以后只对\(P_i\)的子树产生影响 知道这个以后,就可以想到在线维护每个牧场已经被"影响"了多少次(也就 ...

  3. ios9 -3dtouch 手势添加到app上

    模拟器实现3dtouch参考以下网站: http://my.oschina.net/u/2340880/blog/511509 - (BOOL)application:(UIApplication * ...

  4. CF831C Jury Marks

    思路: 关键在于“插入”一个得分之后,其他所有得分也随之确定了. 实现: #include <iostream> #include <cstdio> #include < ...

  5. spring编程框架

    spring boot, spring data, spring framework spring / spring boot @Profile('prod'|'dev'|'other')(伴随@Be ...

  6. spring 将配置文件中的值注入 属性

    1.编写配置文件 #债权转让 #默认周期 必须大于0 credit.defaultDuration=1 #最小转让金额(元) credit.minBidAmount=1.00 #最小转让时间 到期时间 ...

  7. 谈一谈a:link、a:visited、a:hover、a:active的正确使用顺序

    前端路上,未来还远,所以基础部分必须扎实,走好现在脚下的每一步才是现在最重要的. 下面进入正题吧. 1. <a>标签 我们先说一说<a>标签是干啥用的. <a> 标 ...

  8. 一个ROS的服务,使机器人向前移动指定距离

    源代码有点长,放文末链接里了. 服务描述及代码现在的服务是:请求时携带要前进的距离,然后底盘前进相应距离.代码如下,改动很小: #!/usr/bin/env python import rospyfr ...

  9. kvm virt-install 使用小结

    简介: virt-install 能够为KVM.Xen或其它支持libvrit API的hypervisor创建虚拟机并完成GuestOS安装. 此外,它能够基于串行控制台.VNC或SDL支持文本或图 ...

  10. 一个带关闭按钮的Div窗口,很漂亮

    <html><head><title>JS+CSS实现带关闭按钮的DIV弹出窗口</title><script> function lock ...