C语言如何读取文件求某一列的平均值
C语言如何读取文件求某一列的平均值
本篇内容主要讲解“C语言如何读取文件求某一列的平均值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何读取文件求某一列的平均值”吧!
第一部分:比较读取文件的效率
首先随机生成一个文件,1000万行,4列(该文件下面还会用到)。我们看一下上述函数读取文件的效率:
从上图中可以看出,fread 的效率最高,fgetc 的效率最低。当然这种比较很粗浅,但是能大概看出趋势。
各个函数读取文件的代码如下:其中 main 函数是一样的,只是 readFile 函数的实现不同。
#include<stdio.h>#include<stdlib.h>#include<time.h>#defineBUFSIZE4096voidreadFile(FILE*fp);intmain(intargc,char*argv[]){FILE*fp;time_tstart,end;start=time(NULL);if(argc<2){printf("Usage:%s<filename>\n",argv[0]);return1;}if((fp=fopen(argv[1],"r"))==NULL){printf("Error:cannotopenfile\n");return1;}readFile(fp);fclose(fp);end=time(NULL);printf("timespent:%dseconds\n",end-start);return0;}//readFile_fgetc:voidreadFile(FILE*fp){charc;while((c=fgetc(fp))!=EOF);}//readFile_fgets:voidreadFile(FILE*fp){charbuf[BUFSIZE];while(fgets(buf,MAXLINE,fp)!=NULL);}//readFile_fread:voidreadFile(FILE*fp){charbuf[BUFSIZE];while(fread(buf,1,BUFSIZE,fp)>0);}//readFile_fscanf:voidreadFile(FILE*fp){charbuf[BUFSIZE];while(fscanf(fp,"%[^\n]s",buf)==1);}
第二部分:比较求取列平均值的效率
那么各个函数计算列平均值的效率如何呢?我们依然使用上面那1000万行的文件,用上述各个函数实现计算第2列平均数的功能,它们的效率如下:
代码如下:main 函数大体上是一样的,只是 colAver 函数的实现不一样。
(这些代码完善地处理了EOF,无论文件最后是否有空白行都可以正确运行。但是仍然有前提,就是文件中每一行的分隔符(列数)是一样的,否则代码可能会出错。)
这些代码中,fscanf 的最简短,该函数可以大大提高格式化读取数据的编程效率。
#include<stdio.h>#include<stdlib.h>#include<time.h>#defineBUFSIZE4096voidgetColAver(FILE*fp,constintk);intmain(intargc,char*argv[]){FILE*fp;time_tstart,end;start=time(NULL);if(argc<2){printf("Usage:%s<filename>\n",argv[0]);return1;}if((fp=fopen(argv[1],"r"))==NULL){printf("Error:cannotopenfile\n");return1;}getColAver(fp,2);fclose(fp);end=time(NULL);printf("timespent:%dseconds\n",end-start);return0;}//colAver_fgetc:voidgetColAver(FILE*fp,constintk){inti=0;//numof'\t'intj=0;//numofcharsintc;//charcharcol[50];floatsum=0;intn=0;//numoflines.intinCol=0;while((c=fgetc(fp))!=EOF){if(i==k-1){inCol=1;if(c=='\t')i++;elseif(c=='\n')i=0;elsecol[j++]=c;}else{if(c=='\t')i++;elseif(c=='\n')i=0;if(inCol){col[j]='\0';sum+=atof(col);n++;}j=0;inCol=0;}}if(inCol){col[j]='\0';sum+=atof(col);n++;}if(n==0)printf("Error:noline!\n");elseprintf("Theaverageofcol%dis%f\n",k,sum/n);}//colAver_fgets:voidgetColAver(FILE*fp,constintk){inti=0;//numof'\t'intj=0;//numofcharscharcol[50];charbuf[BUFSIZE];floatsum=0;intn=0;//numoflines.intinCol=0;char*p;while(fgets(buf,BUFSIZE,fp)!=NULL){for(p=buf;*p!='\0';p++){if(i==k-1){inCol=1;if(*p=='\t')i++;elseif(*p=='\n')i=0;elsecol[j++]=*p;}else{if(*p=='\t')i++;elseif(*p=='\n')i=0;if(inCol){col[j]='\0';sum+=atof(col);n++;}j=0;inCol=0;}}}if(inCol){col[j]='\0';sum+=atof(col);n++;}if(n==0)printf("Error:noline!\n");elseprintf("Theaverageofcol%dis%f\n",k,sum/n);}//colAver_fread:voidgetColAver(FILE*fp,constintk){inti=0;//numof'\t'intj=0;//numofcharscharcol[50];charbuf[BUFSIZE];floatsum=0;intn=0;//numoflines.intm,l;intsizeChr=sizeof(char);intinCol=0;while((l=fread(buf,sizeChr,BUFSIZE,fp))>0){for(m=0;m<l;m++){if(i==k-1){inCol=1;if(buf[m]=='\t')i++;elseif(buf[m]=='\n')i=0;elsecol[j++]=buf[m];}else{if(buf[m]=='\t')i++;elseif(buf[m]=='\n')i=0;if(inCol){col[j]='\0';sum+=atof(col);n++;}j=0;inCol=0;}}}if(inCol){col[j]='\0';sum+=atof(col);n++;}if(n==0)printf("Error:noline!\n");elseprintf("Theaverageofcol%dis%f\n",k,sum/n);}//colAver_fscanf:voidgetColAver(FILE*fp){floatf;floatsum=0;intn=0;//numoflines.while(fscanf(fp,"%*s%f%*[^\n]s",&f)==1){sum+=f;n++;}if(n==0)printf("Error:noline!\n");elseprintf("Theaverageofcol2is%f\n",sum/n);}
到此,相信大家对“C语言如何读取文件求某一列的平均值”有了更深的了解,不妨来实际操作一番吧!这里是恰卡编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!