|
20鱼币
本帖最后由 Cool_Breeze 于 2020-3-18 09:31 编辑
- #if 0
- By Cool_Breeze
- Rev 01
- #endif
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <malloc.h>
- #include <float.h>
- //返回文件指针
- FILE* filepointer(const char *file,const char *mode);
- /*
- 获取文件第一行项目名总数和最大项目名长度存入数组
- 注意里面有个temp数组大小为1024
- */
- void getitemsum(FILE* fp,int *itemsize);
- /*
- 获取文件第一行的项目名放入数组
- 注意里面有个temp数组大小为1024
- */
- void getitemname(FILE* fp,char *name,int num);
- /*
- 读取每一行数据,按格式分割后放入指定数组
- 注意里面有个temp数组大小为1024
- */
- void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu);
- /*
- 一下函数分析limit文件
- 分析limit文件信息
- 注意里面有个temp数组大小为1024
- */
- void getlimitsize(FILE* fp,int *itemsize);
- /*
- 分析limit文件信息
- 注意里面有个temp数组大小为1024
- */
- void getlimitdata(FILE* fp,int n,char* item,char* comp,double* data);
- //数据比较
- int compare(char *cmp,double s,double l);
- int main(int argc,char *argv[])
- {
- //获取文件指针
- FILE* sourcep=filepointer(argv[1],"rb");
- FILE* limitp=filepointer(argv[2],"rb");
- FILE* resultp=filepointer(argv[3],"wb");
-
- //source文件分析
- //获取文件大小 itemsize[0]储存个数
- static int itemsize[2];
- getitemsum(sourcep,itemsize);
- //开辟项目名空间并赋值
- char (*itemname)[itemsize[1]]=(char(*)[itemsize[1]])calloc(itemsize[0],itemsize[1]*sizeof(char));
- getitemname(sourcep,itemname[0],itemsize[1]);//源文件
- //分配最大值,最小值,求和,平均值空间
- double* max=(double*)calloc(itemsize[0],sizeof(double));
- double* min=(double*)calloc(itemsize[0],sizeof(double));
- double* avg=(double*)calloc(itemsize[0],sizeof(double));
- double* sum=(double*)calloc(itemsize[0],sizeof(double));
- //初始化最大值最小值
- register int i=0;
- for (i=0;i<itemsize[0];i++) *(min+i)=DBL_MAX, *(max+i)=DBL_MIN;
- //获取相应数据
- getdata(sourcep,max,min,avg,sum,itemsize[0]);
- //source文件分析完成
-
- //开始limit文件分析
- //获取文件大小 limitsize[0]储存个数
- static int limitsize[2];
- getlimitsize(limitp,limitsize);
- //开辟项目名空间并赋值
- char (*limititem)[limitsize[1]]=(char (*)[limitsize[1]])calloc(limitsize[0],sizeof(char)*limitsize[1]);
- //注意:比较符号最多占2个字节,所以我给存储数组分配了3个字节空间
- //存放比较符
- char (*comp)[3]=(char (*)[3])calloc(limitsize[0],sizeof(char)*3);
- //存放limit数据
- double* data=(double*)calloc(limitsize[0],sizeof(double));
- getlimitdata(limitp,limitsize[1],limititem[0],comp[0],data);
- //limit文件分析完成
-
- //将source与limit比较
- //打印结果
- fprintf(resultp,"+-------------------------------------------+\r\n");
- fprintf(resultp,"| %-41s |\r\n","Result");
- fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
- fprintf(resultp,"| Nu | %-36s | %-16s | Comp | %-16s | Result |\r\n","Item",argv[1],argv[2]);
- fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
- register int j=1;//源文件第一列忽略
- int error=0;//退出值,0代表Pass ,非0代表Fail
- for (i=0;i<limitsize[0];i++)
- {
- for (j=1;j<itemsize[0];j++)
- {
- if ( ! strcmp(limititem[i],itemname[j]) )//匹配项目名
- {
- if (! compare(comp[i],max[j],data[i]))
- {
- fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf | Fail |\r\n",j,limititem[i],max[j],comp[i],data[i]);
- error++;
- }
- else fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-4s | %-16.5lf | Pass |\r\n",j,limititem[i],max[j],comp[i],data[i]);
- }
- }
- }
- fprintf(resultp,"+----+--------------------------------------+------------------+------+------------------+--------+\r\n");
-
- //打印source和limit分析内容
- fprintf(resultp,"\r\n");
- fprintf(resultp,"+-------------------------------------------+\r\n");
- fprintf(resultp,"| %-41s |\r\n",argv[2]);
- fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
- fprintf(resultp,"| Nu | %-36s | Comp | %-16s |\r\n","Item","Data");
- fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
- for (i=0;i<limitsize[0];i++) fprintf(resultp,"| %-2d | %-36s | %-4s | %-16.5f |\r\n",i+1,limititem[i],comp[i],data[i]);
- fprintf(resultp,"+----+--------------------------------------+------+------------------+\r\n");
- fprintf(resultp,"\r\n");
- fprintf(resultp,"+-------------------------------------------+\r\n");
- fprintf(resultp,"| %-41s |\r\n",argv[1]);
- fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
- fprintf(resultp,"| %-2s | %-36s | %-16s | %-16s | %-16s | %-16s |\r\n","Nu","Item","Max","Min","Sum","Avg");
- fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
- for (i=1;i<itemsize[0];i++) fprintf(resultp,"| %-2d | %-36s | %-16.5lf | %-16.5lf | %-16.5lf | %-16.5lf |\r\n",i,*(itemname+i),max[i],min[i],sum[i],avg[i]);
- fprintf(resultp,"+----+--------------------------------------+------------------+------------------+------------------+------------------+\r\n");
-
- free(itemname);
- free(max);
- free(avg);
- free(min);
- free(sum);
- free(limititem);
- free(comp);
- free(data);
-
- fclose(sourcep);
- fclose(limitp);
- fclose(resultp);
- return error;
- }
- FILE* filepointer(const char *file,const char *mode)
- {
- FILE *fp;
- if (!(fp = fopen(file,mode)))
- {
- printf("open fail! %s\n",file);
- exit(-2);
- }
- return fp;
- }
- /*
- source文件分析
- */
- void getitemsum(FILE* fp,int *itemsize)
- {
- char temp[1024]={"\0"};//临时储存一行数据
- char *tep=temp;
- register int i=0;//项目
- register int m=0;//最大长度
- register int t=0;//临时
- fgets(temp,1024,fp);
- for (;*tep;tep++)
- {
- switch (*tep)
- {
- case ',': i++,t=0;break;//项目加一,长度归零
- case '\n': i++;*itemsize=i;*(itemsize+1)=m+1;return;//(m+1)给最后‘\0’留个位置,最后赋值退出
- default : t++;
- if (t>m) m=t;//始终保持最大长度
- }
- }
- }
- void getitemname(FILE *fp,char *name,int num)
- {
- rewind(fp);
- char temp[1024]={"\0"};//临时储存一行数据
- char *tep=temp;
- register int i=0;//第一维
- register int j=0;//第二维
- fgets(temp,1024,fp);
- for (;*tep;tep++)
- {
- switch (*tep)
- {
- case ',':i++,j=0;break;
- case 10:break;//换行
- case 13:break;//回车
- default :*(name+i*num+j)=*tep;j++;
- }
- }
- }
- void getdata(FILE* fp,double* max,double* min,double* avg,double* sum,int itemnu)
- {
- rewind(fp);
- char temp[1024]={"\0"};//临时储存一行数据
- char *tep=temp;
- register double fdata=0;//储存临时数据
- register int i=1;//数组下标(空出第一列数据待后期使用)
- register int count=0;//统计行数
- fgets(tep,1024,fp);//跳过第一行项目数据
- while ( !feof(fp) )
- {
- count++;
- fgets(temp,1024,fp);
- i=1;
- tep=temp;
- while (*tep)
- {
- if (*(tep++) == ',')
- {
- fdata=atof(tep);
- if (fdata > *(max+i)) *(max+i)=fdata;
- if (fdata < *(min+i)) *(min+i)=fdata;
- *(sum+i) += fdata;
- i++;
- }
- }
- }
- //处理最后一行因有可能出现不完整的数据所导致平均数据不准确
- register int n;
- if (i < itemnu)
- {
- for (n=1;n<itemnu;n++)
- {
- if (n >= i) *(avg+n)=*(sum+n)/(count-1);
- else *(avg+n)=*(sum+n)/count;
- }
- }
- else for (n=1;n<itemnu;n++) *(avg+n)=*(sum+n)/count;
- }
- /*
- limit文件分析
- */
- void getlimitsize(FILE* fp,int *itemsize)
- {
- char temp[1024]={"\0"};//临时储存一行数据
- char *tep=temp;
- register int y=0;//项目
- register int x=0;//最大长度
- register int t=0;//临时
- while (fgets(temp,1024,fp))//空行退出
- {
- tep=temp;
- y++,t=1;
- for (;*tep != ',';tep++) t++;
- if ( t > x ) x = t;
- }
- itemsize[0]=y,itemsize[1]=x+1;//多计算一个给'\0'
- }
- void getlimitdata(FILE* fp,int nu,char* item,char* comp,double* data)
- {
- rewind(fp);
- static char temp[1024];
- char *tep=temp;
- register int yi=0;//item
- register int yc=0;//comp
- register int yd=0;//data
- register int x=0;//字符数组的第一维
- register int n=0;//表示‘,’出现的次数
- while (fgets(temp,1024,fp))
- {
- tep=temp;
- for (;*tep;tep++)
- {
- if (*tep == ',')
- {
- n++;
- x=0;
- continue;
- }
- if (n==0)
- {
- *(item+yi*nu+x)=*tep;x++;
- }
- else if (n==1)
- {
- *(comp+yc*3+x)=*tep;x++;
- }
- else if (n==2)
- {
- *(data+yd)=atof(tep);
- yi++,yc++,yd++,n=0;break;
- }
- }
- }
- }
- //数据比较
- int compare(char *cmp,double s,double l)
- {
- if (! strcmp(cmp,"<")) return (s < l)? 1:0;
- else if (! strcmp(cmp,">")) return (s > l)? 1:0;
- else if (! strcmp(cmp,"=")) return (s = l)? 1:0;
- else if (! strcmp(cmp,"<=")) return (s <= l)? 1:0;
- else if (! strcmp(cmp,">=")) return (s >= l)? 1:0;
- }
复制代码 |
|