| 项目搜索 |
| |
|
代码片段库:
查看代码片段
浏览
| 提交新的代码片段
| 创建代码包
ini文件读写
|
类型:
Function |
类别:
Other
|
许可证:
GNU General Public License |
语言:
C
|
描述:
用来读写类似windows的ini文件的工具
|
该代码片段的版本系列:
片段ID |
下载版本 |
提交时间 |
提交人 |
删除 |
26 | 0.2 | 2002-03-11 18:06 | fengfei | |
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。 |
13 | 0.1 | 2001-10-24 12:42 | tengel | |
点击"下载版本"来下载该代码片段.
最新版本的代码片段: 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));
}
如果您修改了一个代码片段并且觉得很应该让别人共享,您可以把这作为这个代码片段的最新版本提交上来. |
|