千家信息网

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

发表于:2024-10-23 作者:千家信息网编辑
千家信息网最后更新 2024年10月23日,本篇内容主要讲解"C语言如何读取文件求某一列的平均值",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C语言如何读取文件求某一列的平均值"吧!第一部分:比较读
千家信息网最后更新 2024年10月23日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语言如何读取文件求某一列的平均值"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0