Linux 用C修改配置文件中配置项

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux 用C修改配置文件中配置项
众所周知,在Linux 程序,Windows程序开发过程中,配置文件对软件重要性不言而喻!特别是在一个大型系统中更是无可替代。

简单的说,配置文件就是用来在程序启动的时刻,对程序中的全局变量进行初始化。

当然,在程序运行的过程中也是可以更改其全局变量的,但是,如果因为程序故障,服务器突然断电,重新启动程序后,之前的一些参数全部都丢失了,所以我们可以把一些重要的参数,在程序执行过程中会改变的参数,写在配置文件中,当一些重要参数改变后,直接把相应的配置项进行修改即可。

配置文件的修改步骤:
∙找到配置项所在配置项
∙找到要修改的key
∙修改key对应的value
∙保存修改
∙示例代码如下:
∙//本示例中给出的key为要修改的键,value 为修改后的值,对外只需要调用 intchgcfg(void*lbz)
∙// 这个函数即可,使用此函数,可以根据个人需要自行修改!
∙//**************************************************************** *
∙//Author: helpylee (LiBangzhu)
∙//Time: 2014-03-01
∙//Address: Hangzhou
∙//Email: helpylee@
∙//**************************************************************** **
int MyPopen(char*buff,const int maxlen,const char*cmd)
//执行shell命令,把结果保存在buff所指向的内
存中
{
FILE*read_fp;
int chars_read;
read_fp = popen(cmd, "r");
if( NULL == read_fp )
{
perror("popen error");
return-1;
}
chars_read = fread(buff, sizeof(char), maxlen, read_fp);
if(chars_read< 0)
{
printf("popen return NULL \n");
return-2;
}
pclose(read_fp);
buff=NULL;
return0;
}
char* log_delblank(char*srcstr)
// 删除 srcstr所指向的字符串中的空格,并返回无空格字符串
{
if(!srcstr)
return NULL;
char tmpstr[1024];
char*p_src=srcstr;
char*p_tmp=tmpstr;
while(*p_src)
{
if(*p_src=='#')
{
*p_tmp=0;
break;
}
if(*p_src!=' ')
{
*p_tmp=*p_src;
p_tmp++;
}
p_src++;
}
strcpy(srcstr,tmpstr);
return srcstr;
}
bool my_strstr(char* buf,char*t_key)
{
if(buf&&t_key)
{
char mb_key[100]={0};
char ch_value[100]={0};
char line_buf[200]={0};
bzero(mb_key,100);
bzero(ch_value,100);
bzero(line_buf,200);
strcpy(line_buf,buf);
char*pp = log_delblank(line_buf);
sscanf(pp,"%[^=]=%s",mb_key,ch_value);
// cout<<"mb_key="<<mb_key<<endl;
// cout<<"ch_value="<<ch_value<<endl;
if(strncmp(mb_key,t_key,strlen(mb_key))==0)
{ //cout<<"return true"<<endl;
return true;
}
else
{ //cout<<"return false"<<endl;
return false;
}
}
}
int chgcfg(void*lbz)
{
struct stat s;//获取文件属性
if(lstat("xxx.config",&s)<0)
{
return-1;
}
int flen=s.st_size;//获取文件大小
char* buf=(char*)malloc(flen+400); //申请存放文件内容的空间
if(!buf)return-2;
char cmd_out[200];
bzero(cmd_out,sizeof(cmd_out));
MyPopen(cmd_out,100,"cat xxx.config|grep key");
if(my_strstr(cmd_out,"key")&&strlen(cmd_out))
{
FILE* fp = fopen("xxx.config","r");
}
else
{
reutrn -3;
}
char line[300];
bzero(line,sizeof(line));
int change_flag =-1;
while(!feof(fp))
{
if(!fgets(line,sizeof(line),fp))continue;
if(line[0]!='#'&& (my_strstr(line,"key"))) //对key进行第一次确认
{
char maybe_key[100]={0};
char value[100]={0};//修改后的值
char*pp = log_delblank(line);
sscanf(pp,"%[^=]=%s",mb_key,ch_value); //把有可能修改前的参数存储起来
if(strncmp(mb_key,”key“,(int)strlen(key))==0)
//对key进行二次确认
{
sprintf(tmp,"%s = %s\n",”key“,”value“);
//至此已经把想要修改的参数修改完毕了
printf("test->string:%s,test-
>valuestring:%s\n",key,value);
tmp+=strlen(tmp);
change_flag=1; //标记是否修改了文件。

}
else
//如果二次确认后发现待修改的参数不匹配,则不修改
{
sprintf(tmp,"%s ",line);
tmp+=strlen(line);
}
}
else
//如果发现待修改的参数不匹配,则不修改
{
sprintf(tmp,"%s ",line);
tmp+=strlen(line);
}
}
fclose(fp);//修改完毕后,关闭文件指针
if(change_flag == 1)
{
FILE* fp1 = fopen("xxx.config","w+");
//如果发现修改了文件,则首先清空原文件内容,然后写入。

if(!fp1)return-4;
ifprint(fp1,"%s",buf);
fflush(fp1);
fclose(f1);
return1;
}
return-5;
}。

相关文档
最新文档