Chinaunix首页 | 论坛 | 博客
  • 博客访问: 531080
  • 博文数量: 81
  • 博客积分: 1438
  • 博客等级: 上尉
  • 技术积分: 866
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-12 11:32
文章分类

全部博文(81)

文章存档

2014年(1)

2013年(1)

2012年(33)

2011年(46)

分类: LINUX

2012-01-03 21:08:09

读取一个文件,类似
  IP=192.168.1.8
 NETMASK=255.255.255.0
格式的文件,并对文件进行解析,得到其key和value,可以读取相应key的value值,也可以得到配置相应的value;

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,out 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=0;
//查找要修改的项
for(i=0;i<num;i++){
if(!strcmp(items[i].key, key)){
items[i].value
= value;
break;
}
}

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

i
=0;
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);
//清除工作
/*
i=0;
for(i=0;i free(items[i].key);
free(items[i].value);
}
*/

return 0;

}
 
 
阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~