c语言添加子函数文件,C语言实现添加和读取配置文件函数的操作方法

通常由传递的参数具有配置文件的路径,但是对于小编而言,我认为在某些情况下,参数流入更加重要,读取、添加、删除和修改配置文件的功能都是基于流程参数实现的。

"oper_config.h"

#ifndef OPER_CONFIG_H_

#define OPER_CONFIG_H_

#define MAX_LINE_LEN 210

char *read_config(FILE *fp, char *key);

int add_config(FILE *fp, char *key, char *value);

#endif

"oper_config.c"

#include

#include

#include

#include "oper_config.h"

static int check_key(char *line, char *key);

static char *get_value(char *line);

// fp 需要以读的方式得到

char *

read_config(FILE *fp, char *key)

{

char line[MAX_LINE_LEN] = {'\0'};

char *value = NULL;

int ret;

while(fgets( line, sizeof(line), fp) != NULL)

{

ret = check_key(line, key);

if(ret == -1)

{

continue;

}

else

{

value = get_value(line);

if(value == NULL)

{

del_config(fp, key);

return NULL;

}

else

{

return value;

}

}

}/* while */

return NULL;

}

static int

check_key(char *line, char *key)

{

char *k_start, *k_end;  // 指示 key 在 line 中的起始和结束位置

int line_len;

line_len = strlen(line);

if(line_len < 3)

{

return(-1);

}

else

{

k_start = &line[0];

while(((*k_start == ' ') || (*k_start == '\t'))

&& ( k_start <= &line[line_len - 1]))

{

k_start ++;

}

if(*k_start == '#')

{

return(-1);

}

k_end = strchr(line, '=');

if(k_end == NULL)

{

return(-1);

}

k_end --;

while(((*k_end == ' ') || (*k_end == '\t'))

&& (k_end >= k_start))

{

k_end --;

}

if((*k_end == ' ') || (*k_end == '\t'))

{

return(-1);

}

if(strncmp(key, k_start, k_end-k_start + 1) != 0)

{

return(-1);

}

}

return(0);

}/* check_key() */

static char*

get_value(char *line)

{

char *v_start, *v_end;  // 指示 value 在 line 中的起始和结束位置

char *value = NULL;

int line_len;

int val_len;

line_len = strlen(line);

v_start = strchr(line, '='); // 已经在 check_key 中检验过'='的存在

v_start ++;

while(((*v_start == ' ') || (*v_start == '\t'))

&& (v_start <= &line[line_len - 1]))

{

v_start ++;

}

v_end = &line[line_len - 1];

if(((*v_end == ' ') || (*v_end == '\t')

|| (*v_end == '\n')

|| (*v_end == '\r'))

&& (v_end > v_start))

{

v_end --;

}

if((*v_end == ' ') || (*v_end == '\t')

|| (*v_end == '\n')

|| (*v_end == '\r'))

{

return NULL;

}

val_len = v_end - v_start + 1;

value = (char *)malloc((val_len + 1) * sizeof(char));

if(value == NULL)

{

printf("malloc failed.\n");

return NULL;

}

strncpy(value, v_start, val_len);

value[val_len] = '\0';

return value;

}/* get_value() */

// fp 需要以添加的方式得到

int

add_config(FILE *fp, char *key, char *value)

{

char *line = NULL;

int key_len;

int val_len;

key_len = strlen(key);

val_len = strlen(value);

if( (fp == NULL) || (key == NULL) || (value == NULL))

{

return(-1);

}

line = (char *)malloc((key_len + val_len + 5) * sizeof(char));

if(line == NULL)

{

printf("malloc failed.\n");

return(-1);

}

else

{

strncpy(line, key, key_len);

line[key_len] = ' ';

line[key_len + 1] = '=';

line[key_len + 2] = ' ';

line[key_len + 3] = '\0';

strncat(line, value, val_len);

line[key_len + val_len + 3] = '\n';

line[key_len + val_len + 4] = '\0';

if(fputs(line, fp) == EOF)

{

return(-1);

}

}

free(line);

return(0);

}/* add_config() */

说明:

1) 配置文件的数据格式  key = value

2) 支持 '#' 开头注释

3) key, value 前后可有空格, tab.

以上就是爱站技术频道小编给大家述说的C语言实现添加和读取配置文件函数的操作方法,如果有筒靴们感兴趣,可以多多关注爱站技术频道学习更多的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值