C语言如何读取文件求某一列的平均值

发布时间:2022-02-15 13:37:34 作者:iii
来源:亿速云 阅读:221

本篇内容主要讲解“C语言如何读取文件求某一列的平均值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言如何读取文件求某一列的平均值”吧!

第一部分:比较读取文件的效率

首先随机生成一个文件,1000万行,4列(该文件下面还会用到)。我们看一下上述函数读取文件的效率:

C语言如何读取文件求某一列的平均值

从上图中可以看出,fread 的效率最高,fgetc 的效率最低。当然这种比较很粗浅,但是能大概看出趋势。

各个函数读取文件的代码如下:其中 main 函数是一样的,只是 readFile 函数的实现不同。

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #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 <filename>\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列平均数的功能,它们的效率如下:

C语言如何读取文件求某一列的平均值


代码如下:main 函数大体上是一样的,只是 colAver 函数的实现不一样。
(这些代码完善地处理了EOF,无论文件最后是否有空白行都可以正确运行。但是仍然有前提,就是文件中每一行的分隔符(列数)是一样的,否则代码可能会出错。)
这些代码中,fscanf 的最简短,该函数可以大大提高格式化读取数据的编程效率。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BUFSIZE 4096
void 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 <filename>\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语言如何读取文件求某一列的平均值”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. python求平均值的方法
  2. 分享c语言求n个数平均值的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:element怎么实现二级菜单和顶部导航联动

下一篇:vue中Axios如何添加拦截器刷新token

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》