【linux/c】读取配置文件

  • 说在前面

实验环境:ubuntu14

工具使用:VS code

  • 实验结果

对于文件test.conf,读取[mysql] port的值

[ ok ]
v1 =v2
k3 = v3
#k
        #df
dddd
  #[dd]
KK   #  D
KK = == V
        [yu]
        dgf = fd
[mysql]
user = root
 
port = 4450
 
[tr]
    #comment
  t1  = vo
  m2 == max
bn====m8

 

  • 代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define bufSize 1024
#define MaxKeyLength 32

enum bool
{
    false,
    true
};

/* *
 * @param buf
 * @desc 删除buf中的制表符以及注释
 * */
char *trimSp(char *buf)
{
    char tbuf[bufSize] = {'\0'};
    if (buf == NULL || strlen(buf) == 0)
    {
        return NULL;
    }
    int len = strlen(buf);
    int i = 0, j = 0;
    while (i < len)
    {
        //此处注释使用 //
        //若注释使用 # 则使用以下代码代替
        //if (buf[i] == '#')
        //    break;
        if (buf[i] == '/' && buf[i + 1] == '/')
            break;

        if (iscntrl(buf[i]) == 0 && isspace(buf[i]) == 0)
        {
            tbuf[j] = buf[i];
            j++;
        }

        i++;
    }

    //将结果复制到buf
    memset(buf, '\0', len);
    strncpy(buf, tbuf, strlen(tbuf));
    return buf;
}

/***
 * @param buf
 * @desc 获取 = 在字符串中的位置
*/
int getPos(char *buf)
{
    if (buf == NULL || strlen(buf) == 0)
    {
        return -1;
    }
    int len = strlen(buf);
    int i = 0;
    while (i < len)
    {
        if (buf[i] == '=')
        {
            break;
        }
        i++;
    }
    return i++;
}

/* *
 * @param file
 * @param AppName
 * @param KeyName
 * @param KeyVal
 * @desc  从文件‘file’中的[AppName]中读取属性KeyName的值KeyVal
 * */
int ReadConf(char *file, char *AppName, char *KeyName, char *KeyVal)
{
    char buf[bufSize] = {'\0'};
    int find_app_name = false;

    if (file == NULL || strlen(file) == 0) //文件名(路径)检查
    {
        return -1;
    }
    FILE *fp = fopen(file, "r"); //打开文件

    if (fp == NULL) //文件句柄检查
    {
        return -1;
    }

    while (fgets(buf, bufSize, fp) != NULL)
    {
        char *tbuf = trimSp(buf);
        int pos = getPos(tbuf);
        int len = strlen(tbuf);

        //printf("string:%s\n", tbuf);

        //查找到 [NAME]
        if (len > 0 && len == pos && tbuf[0] == '[' && tbuf[len - 1] == ']')
        {
            //存放NAME
            char *t_appname = (char *)malloc(len - 1);
            memset(t_appname, '\0', len - 1);
            strncpy(t_appname, tbuf + 1, len - 2);

            //查找到AppName
            if (strncmp(t_appname, AppName, strlen(t_appname)) == 0)
                find_app_name = true;
            else
                find_app_name = false;

            //注意释放空间,防止内存泄露
            free(t_appname);
        }
        else
        {
            //属性名 与 属性值
            if (len > 0 && pos != len && find_app_name)
            {
                char *val = tbuf + pos + 1;//属性值
                tbuf[pos] = '\0';//将=替换为\0  用以分割属性名 与 属性值
                char *key = tbuf;//属性名

                //查找到属性名
                if (strncmp(key, KeyName, strlen(key)) == 0)
                {
                    //将值复制到 KeyVal
                    strncpy(KeyVal, val, strlen(val));
                    break;
                }
            }
        }
    }
    //关闭文件句柄
    if (fp != NULL)
    {
        fclose(fp);
    }

    return 1;
}

int main()
{
    char KeyValue[MaxKeyLength] = {'\0'};
    ReadConf("./test.conf", "mysql", "port", KeyValue);
    printf("value:%s\n", KeyValue);

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值