用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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#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语言递归与非递归实现字符串反转函数char *reverse(char *str)的方法
栏 目:C语言
本文标题:用C实现添加和读取配置文件函数
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/4448.html
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10使用OpenGL实现3D立体显示的程序代码
- 01-10HDOJ 1443 约瑟夫环的最新应用分析详解
- 01-10用贪心法求解背包问题的解决方法
- 01-10求斐波那契(Fibonacci)数列通项的七种实现方法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery