继续上一篇所写的内容是对配置文件的读取以及获取所需要的数据
这篇将记录对配置文件写入的操作以及步骤,以免以后容易忘记,也供大家参考,这主要是自己写的测试程序
//对配置文件读写 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主要是对应的键,第三个是标志位,用来判断后面该怎么选择的;
上面举个小例子,是将值装填到二维数组,关于cgiFormString是cgi用到的函数库,就是将网页的一个文本框的值取出来存到数组中去/*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); }
这样就会将这三个ip,sm,gw的值写入到配置文件中;
蓝色字体中有关于文件列表的操作其实原理是相同的,就不再赘述;
请大家有什么好的方法请提出来大家互相学习!