继续上一篇所写的内容是对配置文件的读取以及获取所需要的数据
这篇将记录对配置文件写入的操作以及步骤,以免以后容易忘记,也供大家参考,这主要是自己写的测试程序
//对配置文件读写
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;iD2)
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;
}
}
}
}
/***************************以上为蓝色字体**********************************************/
}
黑色字体就是为正常的写入函数,主要是传的参数有三个,第一个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的值写入到配置文件中;
蓝色字体中有关于文件列表的操作其实原理是相同的,就不再赘述;
请大家有什么好的方法请提出来大家互相学习!