Linux配置文件的操作(下)

继续上一篇所写的内容是对配置文件的读取以及获取所需要的数据

这篇将记录对配置文件写入的操作以及步骤,以免以后容易忘记,也供大家参考,这主要是自己写的测试程序

//对配置文件读写
void filewrite(char cbuf[][30],char **cvbuf,int c){   //cbuf[][30]是一个二维数组
	FILE *fp;
	char buf[50];
	char buf1[10];
        char buf2[40];
	char timebuf[20];
	char fileandtime[40];
	int time_h=0,time_f=0,time_s=0,timeall=0;
	char *token;
	char *seps = ",";
	char D1,D2; 
	int i=0,fileflag=0,timeflag=0,writeflag=0;	
    
	if((strcmp(cvbuf[0],"crf")==0)&&(cbuf[0][4]!='\0'))//说明是弹出窗口提交
    {
	 fileflag=1;
    }
	
	fp = fopen("set.conf","rw+");                //打开文件
	if (fp==NULL)  
    {  
        fputs ("File error",stderr);  
        exit (1);  
    }
   while ((fgets (buf, 50, fp)) != NULL)         //循环读取
  {
    if((buf[0]=='#')||(buf[0]=='\r')||(buf[0]==' ')||(buf[0]=='\n'))
	{
	 continue;
	}
    
	
	
	
	memset(buf1,0,10);
	memset(buf2,0,40);
	sscanf( buf, "%[^=]", buf1);
	
	
	
	for(i=0;i<c;i++)
	{
	if(strcmp(cvbuf[i],buf1)==0)
	{
   	   D1=strlen(buf);
	   D2=strlen(cbuf[i]);
	   if(D1>D2)
	   memset(buf,' ',D1);
	   else 
	   memset(buf,' ',D2);
	  
	   fseek(fp,-D1,SEEK_CUR);
	   fputs(buf,fp);
	   fseek(fp,-strlen(buf),SEEK_CUR);
	   fputs(cbuf[i],fp);
	   fseek(fp,strlen(buf)-D2-1,SEEK_CUR);
	   fputs("\n",fp);
		
	}
    }
/***************************以下为蓝色字体**********************************************/	
	if(fileflag==1)
	{
	
	if(timeflag==0)
	{
	if(strcmp(buf1,"time")==0)
	{
	sscanf( buf, "%*[^=]=%[^ ]", buf2);  //通配符取=到\n字符串
	time_h =  (buf2[0]-48)*10+(buf2[1]-48);
	time_f =  (buf2[3]-48)*10+(buf2[4]-48); 
	time_s =  (buf2[6]-48)*10+(buf2[7]-48);
	timeall = time_h*3600+time_f*60+time_s;
	sprintf(timebuf,"%d",timeall);  //记录的是文件的名字
	//strcat()
	//strcat(fileandtime,cbuf[0]);
	//printf("%d",timeall);
	timeflag=1;
	}
	}
   if((buf[0]=='l')&&(buf[2]=='f'))   //说明这一行是文件
	{
	  sscanf( buf, "%*[^=]=%[^ ]", buf2);  //通配符取=到\n字符串
	  
	  if(buf2[0]!='\0')
	 {
	 // printf("%s\n",buf2);
	  //printf("改行不为空");
	  continue;
	 }
	 else
	 {
      if(writeflag==0)	  
	{	  
	   sscanf( cbuf[0], "%*[^=]=%[^ ]", fileandtime);
	   strcat(fileandtime,",");
	   strcat(fileandtime,timebuf);
	   
	   //printf("改行为空");
	   D1=strlen(buf);
	   D2=strlen(fileandtime);
	  // if(D1>D2)
	  // memset(buf,' ',D1);
	  // else 
	   memset(buf,' ',40);
	   
	   fseek(fp,-D1+5,SEEK_CUR);
	   fputs(buf,fp);
	   fseek(fp,-strlen(buf),SEEK_CUR);
	   fputs(fileandtime,fp);
	   fseek(fp,strlen(buf)-D2-1,SEEK_CUR);
	   //fputs("\n",fp);
	   
	   writeflag = 1;
	}	  
	 }
	
	}
	}
	
/***************************以上为蓝色字体**********************************************/	
}

fclose(fp);

}

上面蓝色字体为附加的算法,就是讲一个时间换算为秒,然后在后面的文件列表中将时间加进去,(例如l1f0=2014314.dmx,2000 )这样读取后的文件就会附带时间长度

黑色字体就是为正常的写入函数,主要是传的参数有三个,第一个cbuf二维数组中装填的为要更新写入的数据,第二个参数cvbuf主要是对应的键,第三个是标志位,用来判断后面该怎么选择的;

/*ip设置页面*/
void  getAdvIp(){
   char ip[16];
   char sm[16];
   char gw[16];
   char *valuebuf1[]={"ip","sm","gt"};  //配置文件的键
   char setupbuf[3][30]={{"ip="},{"sm="},{"gt="}};
   /*获取值*/
   cgiFormString("T1", ip , 16);
   cgiFormString("T2", sm , 16);
   cgiFormString("T3", gw , 16);
   strcat(setupbuf[0],ip);
   strcat(setupbuf[1],sm);
   strcat(setupbuf[2],gw);
 
   printf("%s\n",setupbuf[0]);
   printf("%s\n",setupbuf[1]);
   printf("%s\n",setupbuf[2]);
   filewrite(setupbuf,valuebuf1,3);
  
}
上面举个小例子,是将值装填到二维数组,关于cgiFormString是cgi用到的函数库,就是将网页的一个文本框的值取出来存到数组中去

这样就会将这三个ip,sm,gw的值写入到配置文件中;



蓝色字体中有关于文件列表的操作其实原理是相同的,就不再赘述;

请大家有什么好的方法请提出来大家互相学习!









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值