C编程:程序错误。不会显示用户输入的文件的最大/最小/平均值

时间:2015-05-19 06:15:39

标签: c file-io scanf

我尝试创建用户输入文件名的代码,然后程序会找到文件中数字的最小值,最大值和平均值。

这是用户输入程序的文件样本(#是注释,将被忽略):

#Data from field experiment 312A
#2015-01-12
35.6
3.75
#2015-01-13
9
#2015-01-14
43.43
7.0001

这就是我现在对我的代码所拥有的,我尝试结合不同的方法,但是担心我在这一点上太迷失了。

#include <stdio.h>
#include <math.h>

int main()
{
  char ch, file_name[25];
  FILE *fp;
  double average, num = 0, min = 0, max = 0, sum = 0, N;
  int i;

  printf("Please enter the name of the file to load:\n");
  scanf(file_name);

  fp = fopen(file_name, "r");

  if (fscanf(fp, "%lf", &N) == 1)
    {
      for (i = 0; i < N; i++)
      if (num < min || i == 0)
        min = num;
      if (num > max || i == 0)
        max = num;
      sum += num;
    }

  fclose(fp);
  average = sum/N;

  printf("Smallest: %7.2lf\n", min);
  printf("Largest: %7.2lf\n", max);
  printf("Average: %7.2lf\n", average);
  return(0);
}

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

在您的代码中,

  scanf(file_name);

scanf()错误使用,您错过了格式说明符。您必须将其更改为

  scanf("%24s", file_name);    //%s  is the format specifier for a string input

查看man page了解详情。

除此之外,您的程序中存在逻辑错误。您只能阅读一次该文件,这不是您想要的。此外,for()循环没有任何意义。

我的建议是:

  1. 打开文件,然后检查foepn()是否成功。否则,请不要进行。
  2. 使用fgets()阅读整行。
  3. 使用strtod()将输入字符串转换为float
  4. 如果转化成功,请检查< min> max,进行相应更改,然后对结果求和。
  5. 否则,如果转换失败,则为注释,忽略该行。
  6. 继续直到fgets()返回NULL(文件的结束)
  7. 根据sum / (number of successful conversions)
  8. 计算平均值
  9. 打印summaxmin
  10. 关闭文件。
  11. 尽管如此,main()的推荐签名是int main(void)

    编辑:

    伪代码(为了更好地理解而要求)

    #include <stdio.h>
    #include <math.h>
    #include <float.h>
    
    
    int main(void)
    {
    char file_name[25] = {0};
    FILE *fp = NULL;;
    double average = 0, min = DBL_MAX, max = 0, sum = 0;
    int N = 0;
    char buf[128] = {0}; // buffer tyo be used with fgets()
    
    ask for the filename  (using `scanf("%24s", file_name);`)
    
    open the file (using `fp = fopen(file_name, "r");`)
    
        if file cannot be opened successfully (`if (!fp)`)
              exit
    
    while (reading a complete line from file using `fgets(buf, 128, fp)` != EOF)  //EOF ==> end of file
    {
        if (buf[0] ==  `#`)  //comment, no propcessing reqd, continue
            continue;
    
        val = strtod(buf, NULL);  //you should use proper error checking, as metioned in the man page
    
        if (val)  // valid float value found
        {
            if ( val < min )
                min = val;
            else if ( val > max )
                max = val;
    
            sum += val;   //add the value
            N++;          //increase the counter
        }
    }
    
    close the file (using `fclose(fp);`)
    calculate `average = sum/N;`
    
      printf("Smallest: %7.2f\n", min);
      printf("Largest: %7.2f\n", max);
      printf("Average: %7.2f\n", average);
      return(0);
    }
    

答案 1 :(得分:0)

您应该使用非常大的数字初始化min

您的if需要{},否则代码执行的次数与您想象的不同。

在计算sum/N之前,您应该检查N>0

fscanffor的组合无效。