`
ackerman
  • 浏览: 75049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个解析配置文件的小程序

阅读更多

这是一个解析配置文件的小程序,配置文件中只有“key=value”这样的项,面向于简单应用。网上的相关例子都很复杂,而且是可以解析section的,但是有时候配置文件并不需要这么复杂,很可能就几项。这样的文件还有个好处:在shell脚本里source一下,会把key值都设成变量,从而shell也可以操作这个文件。

初学,望指正。

file.h

#ifndef FILE_H_
#define FILE_H_

#ifdef __cplusplus
extern "C"
{
#endif

#define out //用来表示参数是输出型的

//只有两个接口
int read_conf_value(const char *key,out char *value,const char *file);
int write_conf_value(const char *key,char *value,const char *file);

#ifdef __cplusplus
};
#endif
#endif //end of FILE_H_
 

file.c

/*
 *读取配置文件
 *配置文件有如下的形式
 * 	IP=192.168.1.8
 *	NETMASK=255.255.255.0
 *	MAC=12:34:56:78:90:11
 *支持#注释,但更新数据时会把注释全部去掉
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "file.h"

#ifdef __cplusplus
extern "C"
{
#endif

typedef struct item_t {
	char *key;
	char *value;
}ITEM;

/*
 *去除字符串右端空格
 */
char *strtrimr(char *pstr)
{
	int i;
	i = strlen(pstr) - 1;
	while (isspace(pstr[i]) && (i >= 0))
		pstr[i--] = '\0';
	return pstr;
}
/*
 *去除字符串左端空格
 */
char *strtriml(char *pstr)
{
	int i = 0,j;
	j = strlen(pstr) - 1;
	while (isspace(pstr[i]) && (i <= j))
		i++;
	if (0<i)
		strcpy(pstr, &pstr[i]);
	return pstr;
}
/*
 *去除字符串两端空格
 */
char *strtrim(char *pstr)
{
	char *p;
	p = strtrimr(pstr);
	return strtriml(p);
}


/*
 *从配置文件的一行读出key或value,返回item指针
 *line--从配置文件读出的一行
 */
int  get_item_from_line(char *line, out ITEM *item)
{
	char *p = strtrim(line);
	int len = strlen(p);
	if(len <= 0){
		return 1;//空行
	}
	else if(p[0]=='#'){
		return 2;
	}else{
		char *p2 = strchr(p, '=');
		*p2++ = '\0';
		item->key = (char *)malloc(strlen(p) + 1);
		item->value = (char *)malloc(strlen(p2) + 1);
		strcpy(item->key,p);
		strcpy(item->value,p2);

		}
	return 0;//查询成功
}

int file_to_items(const char *file, out ITEM *items, out int *num)
{
	char line[1024];
	FILE *fp;
	fp = fopen(file,"r");
	if(fp == NULL)
		return 1;
	int i = 0;
	while(fgets(line, 1023, fp)){
        	char *p = strtrim(line);
		int len = strlen(p);
		if(len <= 0){
			continue;
		}
		else if(p[0]=='#'){
			continue;
		}else{
			char *p2 = strchr(p, '=');
			/*这里认为只有key没什么意义*/
			if(p2 == NULL)
				continue;
			*p2++ = '\0';
			items[i].key = (char *)malloc(strlen(p) + 1);
			items[i].value = (char *)malloc(strlen(p2) + 1);
			strcpy(items[i].key,p);
			strcpy(items[i].value,p2);

			i++;
		}
	}
	(*num) = i;
	fclose(fp);
	return 0;
}

/*
 *读取value
 */
int read_conf_value(const char *key,char *value,const char *file)
{
	char line[1024];
	FILE *fp;
	fp = fopen(file,"r");
	if(fp == NULL)
		return 1;//文件打开错误
	while (fgets(line, 1023, fp)){
		ITEM item;
		get_item_from_line(line,&item);
		if(!strcmp(item.key,key)){
			strcpy(value,item.value);

			fclose(fp);
			free(item.key);
			free(item.value);
			break;
		}

	}
	return 0;//成功

}
int write_conf_value(const char *key,char *value,const char *file)
{
	ITEM items[20];// 假定配置项最多有20个
	int num;//存储从文件读取的有效数目
	file_to_items(file, items, &num);
	
	int i;
	/*for(i=0;i<num;i++){
		printf("key:%s,value:%s\n",items[i].key,items[i].value);
	}*/

	//查找要修改的项
	for(i=0;i<num;i++){
		if(!strcmp(items[i].key, key)){
			memset(items[i].value,0,sizeof(items[i].value));
                        strcpy(items[i].value,value);
			//printf("get value(write):%s\n",items[i].value);
			break;
		}
	}

	// 更新配置文件,应该有备份,下面的操作会将文件内容清除
	FILE *fp;
	fp = fopen(file, "w");
	if(fp == NULL)
		return 1;

	for(i=0;i<num;i++){
		fprintf(fp,"%s=%s\n",items[i].key, items[i].value);
		//printf("%s=%s\n",items[i].key, items[i].value);
	}
	fclose(fp);
	//清除工作
	for(i=0;i<num;i++){
		free(items[i].key);
		free(items[i].value);
	}

	return 0;

}
#ifdef __cplusplus
}; //end of extern "C" {
#endif

 main.c

#include <stdio.h>
#include "file.h"

int main(void)
{
	char value[50]={0};
	read_conf_value("MAC",value,"./net.conf");
	printf("MAC_orignal:%s\n",value);

	write_conf_value("MAC","12:34:56:78:90:12","./net.conf");
	read_conf_value("MAC",value,"./net.conf");
	printf("MAC_new:%s\n",value);


	return 0;
}

 net.conf

IPADDR=192.168.1.6
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
MAC=12:34:56:78:90:12
 

编译

gcc -o test main.c file.c
 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    MySQL配置文件解析

    MySQL配置文件解析主要涉及到MySQL服务器的参数调整,这些参数直接影响数据库的性能和稳定性。配置文件通常命名为`my.cnf`或`my.ini`,在不同的操作系统路径可能不同。以下是几个关键参数的解释: 1. `port`:指定...

    凯立德2012配置文件解析与参考.zip

    6. **个性化体验**:通过深入解析配置文件,用户还可以实现一些高级功能,如自定义快捷键、添加个性化的兴趣点等,提升导航的个性化体验。 然而,配置文件的修改需要一定的技术基础,不恰当的修改可能导致软件运行...

    配置文件解析器

    总的来说,配置文件解析器是软件开发中的一个重要工具,它简化了对INI格式配置文件的处理,使得管理配置数据变得更为便捷。在给定的“iniconfig”库中,可能提供了更高级的功能,如错误处理、类型转换等,以适应不同...

    Taro 3 React 小程序解析md文件进行显示

    Taro 是一个开源的多端开发框架,它允许开发者使用React语法编写代码,然后编译到微信小程序、H5、React Native等多个平台。Taro 3已经全面支持React Hooks,使得状态管理和组件复用更加便捷。 首先,让我们关注...

    解析配置文件 工程源码

    本篇文章将深入探讨如何利用Java来解析配置文件,同时借鉴Solr源码中的最佳实践。 首先,配置文件通常以XML、JSON或Properties格式存在。在Java中,解析这些文件有相应的库支持。例如,对于XML配置文件,我们可以...

    C语言 实现配置文件的编写与解析

    为了编写配置文件,你需要提供一个接口,允许用户设置和获取配置项。这可以通过一组函数实现,比如`set_config_value()`和`get_config_value()`。 此外,考虑到错误处理,需要在读取和解析过程中捕获可能的异常,如...

    凯立德配置文件解析与参考V5.0.zip

    这样的工具对于开发者或者对系统有深入需求的用户来说非常有价值,他们可以通过解析配置文件,了解系统的工作原理,定制个性化设置,或者解决可能出现的问题。 "CarelandCfgTools.ini" 则是一个初始化配置文件,...

    配置文件c++程序。打包文件

    这可以通过在主函数中调用一个配置读取函数来完成,该函数可以使用上述提到的库来解析文件,并将结果存储在结构体、类实例或全局变量中。 6. **错误处理和兼容性**:在处理配置文件时,应考虑到错误处理,如文件不...

    JAVA高手解析XML配置文件的读取操作.pdf

    本文主要讲解了 Java 中如何读取 XML 配置文件,并对 XML 解析器进行了分类,分别介绍了 DOM 和 SAX 两种解析方式的特点和使用场景,并提供了一个使用 SAX 解析器读取 XML 配置文件的示例程序。 在 Java 开发中,...

    凯立德配置文件解析修改器

    "凯立德2012配置文件解析与参考.exe"是这个工具的执行程序,用户可以通过运行这个文件来启动修改器。这个版本可能针对的是凯立德2012版的配置文件,因此在使用时需要确保你的凯立德导航软件是对应版本,否则可能会...

    百度小程序富文本解析组件bdparse

    - **bdParse.swan**:这可能是针对百度智能小程序特性的配置文件或扩展代码。 - **emojis**:这个文件可能包含了表情符号的处理逻辑,帮助解析HTML中的表情符号并显示在百度小程序中。 4. **使用方法**: 开发者...

    小程序富文本解析

    在微信小程序开发中,富文本解析是一个常见的需求,主要用于处理包含HTML或Markdown格式的文本内容。富文本可以包含各种格式的元素,如字体、颜色、链接、图片等,使得内容展示更加丰富多彩。本文将深入探讨如何在...

    Go-mini-golang包解析ini风格配置文件

    "Go-mini-golang包"就是针对这种需求设计的一个小型库,它专门用于解析ini风格的配置文件。本文将详细介绍这个库的使用方法、核心功能以及其在实际项目中的应用。 首先,让我们理解什么是ini文件。INI文件是一种...

    ini配置文件解析工具

    总的来说,这个 ini 配置文件解析工具提供了一个轻量级的解决方案,适用于需要快速读写 ini 文件的项目。它的源码简洁明了,方便自定义和扩展,对于初学者来说也是一个了解配置文件解析和C++编程的好例子。通过深入...

    小程序富文本样式解析(完整)

    为了解决这个问题,开发者可以借助“mp-html”组件,它是一个专门为微信小程序设计的富文本解析库,能够有效地解析和展示各种HTML样式,确保内容的完整性。 本文将深入讲解如何使用“mp-html”在小程序中实现富文本...

    微信小程序源码实例解析

    微信小程序的源码通常由多个文件组成,包括JSON配置文件、WXML结构文件、WXSS样式文件和JS逻辑文件。JSON文件用于定义页面配置,WXML文件类似HTML,负责页面结构,WXSS类似于CSS,处理样式,JS文件则处理业务逻辑和...

    微信小程序短视频去水印_短视频解析源码.zip

    6. **小程序源码结构**:一个标准的小程序项目通常包括wxml、wxss、js和json四种类型的文件。wxml负责界面布局,wxss处理样式,js处理逻辑,json定义页面配置。根据压缩包中的文件列表,部分js文件可能代表不同的...

    VB配置文件生成(可以生成和读取程序的配置文件)

    本项目提供了一个简单的实现,使开发者能够轻松地在VB程序中处理配置文件。 首先,我们要了解配置文件通常是什么。在Windows环境中,配置文件通常是INI或XML格式,它们包含了应用程序运行时所需的各种参数。VB中的...

    解析XML和Propertites配置文件

    标题中的“解析XML和Propertites配置文件”指的是在软件开发中处理两种常见的配置文件格式。XML(eXtensible Markup ...对于大型项目,正确解析和管理配置文件至关重要,因为这直接影响到程序的运行效果和可配置性。

Global site tag (gtag.js) - Google Analytics