鱼C论坛

 找回密码
 立即注册
查看: 890|回复: 3

[已解决]往文件里写入几个数求平均值

[复制链接]
发表于 2020-12-27 11:18:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一世轻尘 于 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;
}
为啥只读第一个数鸭
最佳答案
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")          ;
        }
}
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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")          ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
}
我照着你的意思改了,可是读完四个数后,它会把第四个数再读一遍,这是为啥?
1.png
2.png
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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) ; // 读
        }

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 06:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表