为了完成读取系统中的配置文件的某个key键的值,由于使用别人的库总是不爽,而且对于格式有一定的要求,那么就自己来写一个这样的接口以供使用了。实现原理很简单,通过打开配置文件,进行一行一行的读取,对比行中是否存在key串且此key串的下一个字符是否为'=',若是,则得到'='号之后的值。
注意:此实现方法只适用于key=value这样的配置格式,而不是很多配置文件的key="value"的格式。
以下即是此接口的实现及测试代码:
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
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/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\n", 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
?* *******************************************************************/