ENGLISH 意见建议 网站地图 网站帮助
广泛智力汇聚   高效成果传播   先进机制培育
联盟首页  |  协同开发  |  开放源码库  |  安全告警  |  开源导航  |  文档中心  |  服务支持  |  共创论坛  |  关于联盟


注册会员 网站帮助
    您的位置 »
    今天是: 2010年11月22日    
项目搜索

完全匹配   
开源软件
软件分类表
新发布软件
其它网站镜像
代码片断
协同开发
文档
论坛
寻求协助
热点项目
站点状态
编译工厂

联系我们
关于联盟

代码片段库:
查看代码片段

浏览 | 提交新的代码片段 | 创建代码包

ini文件读写

类型:
Function
类别:
Other
许可证:
GNU General Public License
语言:
C
 
描述:
用来读写类似windows的ini文件的工具

该代码片段的版本系列:

片段ID 下载版本 提交时间 提交人 删除
260.22002-03-11 18:06fengfei
Changes since last version:
1、增加了get_ini_int,get_ini_bool,set_ini_int,set_ini_bool函数,使读写配置更加方便。
2、修改了原来函数的appname和keyname中存在空格或者TAB时,不能正确读出配置项的问题。
3、把appname,keyname中区分大小写的功能修改为不区分大小写。
4、修改函数的一些bug。
130.12001-10-24 12:42tengel

点击"下载版本"来下载该代码片段.


最新版本的代码片段: 0.2


/* get_ini.h*/
#ifndef GET_INI_H
#define GET_INI_H

#define LINELEN	4096
extern int get_ini_string(const char *filename,const char *appname,
		   const char *keyname,const char *defval,
		   char *buf, int len);
extern int get_ini_int(const char *filename,const char *appname,
		   const char *keyname,const int defval,
		   int *val);
extern int get_ini_bool(const char *filename,const char *appname,
		   const char *keyname,const int defval,
		   int *val);

extern int set_ini_string( const char *filename,const char *appname,
		    const char *keyname,const char *val);
extern int set_ini_int(const char *filename,const char *appname,
		    const char *keyname,const int val);
extern int set_ini_bool(const char *filename,const char *appname,
		    const char *keyname,const int val);

#endif

/* get_ini.c*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "get_ini.h"

void skip_left_space(char **str)
{
	while ((*(*str) == ' ') || (*(*str) == '\t'))
		(*str)++;
}
void skip_right_space(char **str)
{
	int i;
	i = strlen(*str);
  	while(i >=0 && (*(*str + i-1) ==' ' || *(*str + i-1) =='\t'))
  		i--;
  	*(*str+i) =0;
}
void skip_lr_space(char **str)
{
	skip_left_space(str);
	skip_right_space(str);
}

int isapp(const char *linedata, const char *appname)
{
	char line[LINELEN];
	char *str = line;
	char *right;

	memcpy(line, linedata, LINELEN);

	skip_lr_space(&str);
	if (*str != '[')
		return -1;
	else {
		str++;
		right = str;
		while (*right != '\0') {
			if (*right == ']')
				break;
			right++;
		}
		if (*right != '\0')
			*right = '\0';
	}
	skip_lr_space(&str);
	if(strcasecmp(str, appname) == 0)
		return(0);
	return(-1);
}

int gotoapp(FILE * file, const char *appname)
{
	char line[LINELEN];
	char *str = NULL;

	while ((str = fgets(line, LINELEN, file)) != NULL)
	{
		if (isapp(str, appname) == 0)
			return 0;
	}

	return -1;
}

int notkeyline(char *line, const char *keyname, char **val)
{
	char *str = line;
	char *right;

	skip_left_space(&str);

	if (*str == '[') return -1;

	right = str;
	while (*right != '\0') {
		if (('=' == *right) || (' ' == *right)
		    || ('\t' == *right))
			break;
		right++;
	}
	if (*right != '\0') {
		*right = '\0';
	} else
		return 1;
	skip_lr_space(&str);
	if (strcasecmp(str, keyname) == 0 ) {
		str = right + 1;
		skip_lr_space(&str);
		*val = str;
		return 0;
	}

	return 1;
}

int getkey(FILE * file, const char *keyname, char *buf, int len)
{
	char line[LINELEN];
	char *str = NULL;

	while (NULL != (str = fgets(line, LINELEN, file))) {
		int len = strlen(line);
		while (line[len - 1] == '\n' || line[len - 1] == '\r')
			len--;
		line[len] = '\0';
		if (!notkeyline(line, keyname, &str)) {
			strncpy(buf, str, len);
			return 0;
		}
	}

	return -1;
}
void addappkey(FILE *file, const char *appname, const char *key,
	       const char *val)
{
	char buf[LINELEN] ="[";

	strncat(buf, appname, LINELEN-1);
	strcat(buf, "]");
	fprintf(file, "%s\n", buf);
	snprintf(buf, LINELEN, "%s=%s", key, val);
	fprintf(file, "%s\n", buf);
}



/* get a inifile's key value, returned by string */
int get_ini_string(const char *filename,const char *appname,
		   const char *keyname,const char *defval,
		   char *buf, int len)
{
	FILE *file = fopen(filename, "r+");

	if (file == NULL || buf == NULL) return -1;
	if (gotoapp(file, appname) < 0) {
		strncpy(buf, defval, len);
		return(-1);
	} else {
		if (getkey(file, keyname, buf, len) < 0)
		{
			if(defval != NULL)
				strncpy(buf, defval, len);
			else
				buf[0] = 0;
			return(-1);
		}
	}

	fclose(file);

	return 0;
}

/* get a inifile's key value, returned by int */
int get_ini_int(const char *filename,const char *appname,
		   const char *keyname,const int defval,
		   int *val)
{
	char buf[LINELEN];

	get_ini_string(filename,appname,keyname, NULL,buf,LINELEN);
	if(buf != NULL)
		*val = atoi(buf);
	else
		*val = defval;

	return 0;
}
/* get a inifile's key value, returned by int */
int get_ini_bool(const char *filename,const char *appname,
		   const char *keyname,const int defval,
		   int *val)
{
	char buf[LINELEN];

	get_ini_string(filename,appname,keyname,"",
		   	buf,LINELEN);

 	if(strcasecmp(buf,"yes")==0 || strcasecmp(buf,"y")==0)
 	{
 		*val=1;
 	}
 	else if(strcasecmp(buf,"no") == 0 || strcasecmp(buf,"n")==0)
 	{
 		*val=0;
 	}
 	else
 	{
 		*val = defval;
 		return(-1);
 	}

	return(0);

}

/* set a inifile's key value by string */
int set_ini_string( const char *filename,const char *appname,
		    const char *keyname,const char *val)
{
	int app,ret;
	FILE *file,*newfile;
	char *str,tmpname[513];
	char line[LINELEN];
	char linecpy[LINELEN];

	if ((file = fopen(filename, "r+")) == NULL) {

		if((file = fopen(filename, "w+"))  == NULL)
			return -1;

		addappkey(file, appname, keyname, val);
		fclose(file);
	}
	else
	{
		sprintf(tmpname, "%s~", filename);
		app = 0;
		newfile = fopen(tmpname, "w+");
		while (fgets(line, LINELEN, file) != NULL)
		{
			if (app <= 0)
			{
			       if (isapp(line, appname) == 0)
				       app =1;
				fprintf(newfile, "%s", line);
			}
			else
			{
				memcpy(linecpy, line, LINELEN);
				if ((ret = notkeyline(line, keyname, &str)) == 0)
				{
					fprintf(newfile, "%s=%s\n", keyname, val);
					app = -1;
				}
				else if (ret == 1)
				{
					fprintf(newfile, "%s", linecpy);
				}
				else
				{
					fprintf(newfile, "%s=%s\n", keyname, val);
					fprintf(newfile, "%s", linecpy);
					app = -1;
				}
			}
		}
		if (app == 0)
		{
			addappkey(newfile, appname, keyname, val);
		}
		fclose(newfile);
		fclose(file);
		rename(tmpname, filename);
	}

	return 0;
}
/* set a inifile's key value by int */
int set_ini_int(const char *filename,const char *appname,
		    const char *keyname,const int val)
{
	char buf[LINELEN];
	snprintf(buf,LINELEN,"%d",val);
	return(set_ini_string( filename,appname,keyname,buf));
}
/* set a inifile's key value by bool */
int set_ini_bool(const char *filename,const char *appname,
		    const char *keyname,const int val)
{
	char buf[LINELEN];

	if(val)
		snprintf(buf,LINELEN,"yes");
	else
		snprintf(buf,LINELEN,"no");

	return(set_ini_string( filename,appname,keyname,buf));
}
		

提交新版本

如果您修改了一个代码片段并且觉得很应该让别人共享,您可以把这作为这个代码片段的最新版本提交上来.


联盟团体会员
合作伙伴
© 共创软件联盟 版权所有
联盟服务条款 | 联盟隐私权规则 | 联系我们
电话: (8610)68313388-5949 | 传真: (8610)88377936
京ICP备05056057号