C语言如何读取文件求某一列的平均值
发表于:2024-10-22 作者:千家信息网编辑
千家信息网最后更新 2024年10月22日,本篇内容主要讲解"C语言如何读取文件求某一列的平均值",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C语言如何读取文件求某一列的平均值"吧!第一部分:比较读
千家信息网最后更新 2024年10月22日C语言如何读取文件求某一列的平均值
本篇内容主要讲解"C语言如何读取文件求某一列的平均值",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C语言如何读取文件求某一列的平均值"吧!
第一部分:比较读取文件的效率
首先随机生成一个文件,1000万行,4列(该文件下面还会用到)。我们看一下上述函数读取文件的效率:
从上图中可以看出,fread 的效率最高,fgetc 的效率最低。当然这种比较很粗浅,但是能大概看出趋势。
各个函数读取文件的代码如下:其中 main 函数是一样的,只是 readFile 函数的实现不同。
#include#include #include #define BUFSIZE 4096 void readFile(FILE* fp); int main(int argc, char* argv[]) { FILE *fp; time_t start, end; start = time(NULL); if (argc < 2) { printf("Usage: %s \n", argv[0]); return 1; } if ((fp = fopen(argv[1], "r")) == NULL) { printf("Error: cannot open file\n"); return 1; } readFile(fp); fclose(fp); end = time(NULL); printf("time spent: %d seconds\n", end - start); return 0; } // readFile_fgetc: void readFile(FILE* fp) { char c; while ((c = fgetc(fp)) != EOF) ; } // readFile_fgets: void readFile(FILE* fp) { char buf[BUFSIZE]; while (fgets(buf, MAXLINE, fp) != NULL) ; } // readFile_fread: void readFile(FILE* fp) { char buf[BUFSIZE]; while (fread(buf, 1, BUFSIZE, fp) > 0) ; } // readFile_fscanf: void readFile(FILE* fp) { char buf[BUFSIZE]; while (fscanf(fp, " %[^\n]s", buf) == 1) ; }
第二部分:比较求取列平均值的效率
那么各个函数计算列平均值的效率如何呢?我们依然使用上面那1000万行的文件,用上述各个函数实现计算第2列平均数的功能,它们的效率如下:
代码如下:main 函数大体上是一样的,只是 colAver 函数的实现不一样。
(这些代码完善地处理了EOF,无论文件最后是否有空白行都可以正确运行。但是仍然有前提,就是文件中每一行的分隔符(列数)是一样的,否则代码可能会出错。)
这些代码中,fscanf 的最简短,该函数可以大大提高格式化读取数据的编程效率。
#include#include #include #define BUFSIZE 4096void getColAver(FILE* fp, const int k); int main(int argc, char* argv[]) { FILE *fp; time_t start, end; start = time(NULL); if (argc < 2) { printf("Usage: %s \n", argv[0]); return 1; } if ((fp = fopen(argv[1], "r")) == NULL) { printf("Error: cannot open file\n"); return 1; } getColAver(fp, 2); fclose(fp); end = time(NULL); printf("time spent: %d seconds\n", end - start); return 0; } // colAver_fgetc: void getColAver(FILE* fp, const int k) { int i = 0; // num of '\t' int j = 0; // num of chars int c; // char char col[50]; float sum = 0; int n = 0; // num of lines. int inCol = 0; while ((c = fgetc(fp)) != EOF) { if (i == k - 1) { inCol = 1; if (c == '\t') i++; else if (c == '\n') i = 0; else col[j++] = c; } else { if (c == '\t') i++; else if (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: no line!\n"); else printf("The average of col %d is %f\n", k, sum / n); } // colAver_fgets: void getColAver(FILE* fp, const int k) { int i = 0; // num of '\t' int j = 0; // num of chars char col[50]; char buf[BUFSIZE]; float sum = 0; int n = 0; // num of lines. int inCol = 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++; else if (*p == '\n') i = 0; else col[j++] = *p; } else { if (*p == '\t') i++; else if (*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: no line!\n"); else printf("The average of col %d is %f\n", k, sum / n); } // colAver_fread: void getColAver(FILE* fp, const int k) { int i = 0; // num of '\t' int j = 0; // num of chars char col[50]; char buf[BUFSIZE]; float sum = 0; int n = 0; // num of lines. int m, l; int sizeChr = sizeof(char); int inCol = 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++; else if (buf[m] == '\n') i = 0; else col[j++] = buf[m]; } else { if (buf[m] == '\t') i++; else if (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: no line!\n"); else printf("The average of col %d is %f\n", k, sum / n); } // colAver_fscanf: void getColAver(FILE* fp) { float f; float sum = 0; int n = 0; // num of lines. while (fscanf(fp, "%*s%f%*[^\n]s", &f) == 1) { sum += f; n++; } if (n == 0) printf("Error: no line!\n"); else printf("The average of col 2 is %f\n", sum / n); }
到此,相信大家对"C语言如何读取文件求某一列的平均值"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
文件
函数
效率
平均值
代码
语言
j++
内容
只是
学习
不同
实用
更深
最低
最高
简短
粗浅
一行
上图
兴趣
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库中$表示什么
迷妹怎么完成服务器的验证
阿里云新建不了数据库
数据库分组查询只能做统计吗
中文科技期刊数据库的高级检索
贫困数据库
怎么访问外网服务器
海珠网络安全运维找哪家
成立一家软件开发公司
软件开发过程中的奇葩事
万方数据资源包括哪些数据库
网络安全无异常
海康 网络视频服务器
存储过程 还原数据库
深圳神聊网络技术
db2数据库导出数据
东营党建设计软件开发系统
拉文凯斯服务器合服
吉大mof数据库
四川中翼互联网络科技
数据库没有值就插值
win10软件开发的多么
如何看待校园网络安全
数据库行是属性吗
如何取消服务器启动项
青海智慧养老软件开发专业制作
网络安全学习的主要内容
学习 网络安全法律 感想
北京泽元软件开发公司电话
湘潭软件开发外包公司