一世轻尘 发表于 2020-12-27 11:18:40

往文件里写入几个数求平均值

本帖最后由 一世轻尘 于 2020-12-27 11:22 编辑

#include<stdio.h>
#include<stdlib.h>
int main()
{
        FILE*fp;
        float num;
        int n,i,ch2;
        float ch,ch1;
        if((fp=fopen("studentGrades.txt","w"))==NULL)
        {
                printf("error\n");
                exit(0);
        }
        printf("请输入你要写入的数据的个数:\n");
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
                scanf("%f",&ch);
                fprintf(fp,"%f",ch);
        }
        fclose(fp);
        if((fp=fopen("studentGrades.txt","r"))==NULL)
        {
                printf("error\n");
                exit(0);
        }
        while(!feof(fp))
        {
                fscanf(fp,"%f",&ch1);
                num+=ch1;
        }
        num=num/4;
        printf("%.2f",num);
        fclose(fp);
        return 0;
}
为啥只读第一个数鸭{:10_243:}

jackz007 发表于 2020-12-27 11:59:48

本帖最后由 jackz007 于 2020-12-27 12:03 编辑

       两个问题:
       1、数据之间必须有空格
       2、一行数据的末尾必须要有换行符

#include<stdio.h>

int main()
{
      FILE * fp                                                ;
      float num                                                ;
      int c , n , i , ch2                                        ;
      float ch , ch1                                             ;
      if((fp = fopen("studentGrades.txt" , "w")) != NULL) {
                printf("请输入你要写入的数据的个数 : ")            ;
                scanf("%d" , & n)                                  ;
                printf("请输入你要写入的数据 : ")                  ;
                for(i = 0 ; i < n ; i ++) {
                        scanf("%f" , & ch)                         ;
                        if(! (i % 10)) {
                              if(i) fprintf(fp , "\n")         ; // 每行 10 个数,行末写回车
                        } else {
                              fprintf(fp , " ")                  ; // 数据之间要有空格
                        }                        
                        fprintf(fp ,"%.6f",ch)                     ;
                }
                fprintf(fp ,"\n")                                  ; // 最后一个数写完一定要带回车
                fclose(fp)                                       ;
                if((fp = fopen("studentGrades.txt" , "r")) != NULL) {
                        num = c = 0                              ;
                        fscanf(fp , "%f" , & ch1)                  ; // 循环前先一定要先读一次
                        while(! feof(fp)) {                        
                              c ++                               ;
                              num += ch1                         ;
                              fscanf(fp , "%f" , & ch1)          ;
                        }
                        fclose(fp)                                 ;
                        if(c) num /= c                           ;
                        printf("%.6f\n" , num)                     ;
                } else {
                        fprintf(stderr , "无法为读而打开文件.\n");
                }
      } else {
                fprintf(stderr , "无法为写而打开文件.\n")          ;
      }
}

一世轻尘 发表于 2020-12-27 13:03:40

jackz007 发表于 2020-12-27 11:59
两个问题:
       1、数据之间必须有空格
       2、一行数据的末尾必须要有换行符

#include<stdio.h>
#include<stdlib.h>
int main()
{
        FILE*fp;
        float num;
        int n,i,ch2,N=0;
        float ch,ch1;
        if((fp=fopen("studentGrades.txt","w"))==NULL)
        {
                printf("error\n");
                exit(0);
        }
        printf("请输入你要写入的数据的个数:\n");
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
                scanf("%f",&ch);
                fprintf(fp,"%.2f",ch);               
                if(i%10==0&&i<n)
                {
                        fprintf(fp,"\n");
                }
                else
                        fprintf(fp," ");
        }
        fprintf(fp,"\n");
        fclose(fp);
        if((fp=fopen("studentGrades.txt","r"))==NULL)
        {
                printf("error\n");
                exit(0);
        }
        fscanf(fp,"%f",&ch1);
        num=ch1;N+=1;
        while(!feof(fp))
        {
                fscanf(fp,"%f",&ch1);
                num+=ch1;
                N+=1;
        }
        num=num/N;
        printf("%.2f",num);
        fclose(fp);
        return 0;
}我照着你的意思改了,可是读完四个数后,它会把第四个数再读一遍,这是为啥?

jackz007 发表于 2020-12-27 13:10:59

本帖最后由 jackz007 于 2020-12-27 13:15 编辑

一世轻尘 发表于 2020-12-27 13:03
我照着你的意思改了,可是读完四个数后,它会把第四个数再读一遍,这是为啥?

      循环读取文件的逻辑是,先读,确定读到的不是文件结尾才能用。所以,fscanf() 必须是 while() 循环的最后一句。

      fscanf(fp , "%f" , & ch1) ;
      num = ch1               ;
      N += 1                  ;
      while(! feof(fp)) {
                fscanf(fp , "%f" , & ch1) ;
                num += ch1                ;
                N += 1                  ;
      }
      改为:
      fscanf(fp , "%f" , & ch1) ;         // 读
      while(! feof(fp)) {               // 判
                num += ch1                ; // 用
                N += 1                  ; // 用
                fscanf(fp , "%f" , & ch1) ; // 读
      }

页: [1]
查看完整版本: 往文件里写入几个数求平均值