PP圆圆像河马 2023-04-13 11:19 采纳率: 66.7%
浏览 52
已结题

输出得不到想要的结果

输出的算数平均数永远为0,从文件中读取的temp永远是0,请问是哪里出现了问题,谢谢


/*
编写一个程序,不接受任何参数或接受一个命令行参数,
如果有一个参数,将其解释为文件名,如果没有参数,交互得到文件名,
往文件内输入浮点数,假设输入全是浮点数,该程序要计算并报告输入数字的算数平均值
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 30
char * s_gets(char * st,int n);

int main(int argc,char * argv[]){

    char filename[SIZE];
    FILE *fp;
    double numbers[4];
    double sum=0.0;
    int count=0;

    if(argc==1){        //命令行无待处理的文件名
        if(s_gets(filename,SIZE)){       //通过交互给文件名获取成功
            if((fp=fopen(filename,"wb"))==NULL){          //不可以以二进制方式写进文件
                fprintf(stderr,"Can't write the file %s .\n",filename);
                exit(EXIT_FAILURE);
            }
            else{                  //可以以二进制方式写文件
                int num=0;
                fread(numbers,sizeof(double),4,stdin);    //从标准输入读数字
                num=fwrite(numbers,sizeof(double),4,fp);        //写出到文件内
               // rewind(fp);        //把指针指向文件最开始位置
                
                fclose(fp);

                if((fp=fopen(filename,"rb"))==NULL){          //不可以以二进制方式读文件
                fprintf(stderr,"Can't write the file %s .\n",filename);
                exit(EXIT_FAILURE);
            }

                for(int i=0;i<num;i++){
                    double temp;
                    long offsets=(long)i*sizeof(double);
                    fseek(fp,offsets,SEEK_SET);
                    fread(&temp,sizeof(double),1,fp);         //读文件
                    sum+=temp;
                }
                if(num>0){
                    printf("算数平均数为:%f\n",sum/num);
                }
                else{
                    fprintf(stderr,"zero\n");
                }
                fclose(fp);
                
            }
        }
        else{        //通过交互获取文件名失败
            fprintf(stderr,"Error in getting filename .\n");
            exit(EXIT_FAILURE);
        }
    }
    else if(argc==2){         //命令行有待处理的文件名
         //同argc==1时的情况,此处省略
    }
    else{                  //命令行参数太多,报错退出
        fprintf(stderr,"Too much arguments in file %s .\n",argv[0]);
        exit(EXIT_FAILURE);
    }


    return 0;
}

char * s_gets(char * st,int n){
    char * ret_val;
    char * find;
    ret_val=fgets(st,n,stdin);
    if(ret_val){
        find=strchr(st,'\n');
        if(find){
            *find='\0';
        }
        else{
            while(getchar()!='\n'){    //清空标准输入缓冲区数据
                continue;
            }
        }
    }
    return ret_val;
}
  • 写回答

1条回答 默认 最新

  • 浪客 2023-04-13 13:28
    关注

    简单修改了下。

    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define SIZE 30
    char *s_gets(char *st, int n);
    
    int main(int argc, char *argv[])
    {
    
        char filename[SIZE];
        FILE *fp;
        double numbers[4];
        double sum = 0.0, temp;
        int count = 0;
    
        //-- 先搞定文件名
        if (argc == 1)
        { // 命令行无待处理的文件名
            if (!s_gets(filename, SIZE))
            { // 通过交互给文件名获取成功
                fprintf(stderr, "Error in getting filename .\n");
                exit(EXIT_FAILURE);
            }
        }
        else if (argc == 2) //-- argc==2时复制文件名到filename
            strcpy(filename, argv[1]);
        else
        { // 命令行参数太多,报错退出
            fprintf(stderr, "Too much arguments in file %s .\n", argv[0]);
            exit(EXIT_FAILURE);
        }
    
        //-- 之后开始计算
        if ((fp = fopen(filename, "wb")) == NULL)
        { // 不可以以二进制方式写进文件
            fprintf(stderr, "Can't write the file %s .\n", filename);
            exit(EXIT_FAILURE);
        }
    
        // else  文件打开失败exit了,-- 不需要else
        //{ // 可以以二进制方式写文件
        int num = 0;
    
        //-- ctrl+Z结束读取
        while (~scanf("%lf", &temp))
        {
            // fread(numbers, sizeof(double), 4, stdin);     // 从标准输入读数字
            fwrite(&temp, sizeof(double), 1, fp); // 写出到文件内
            num++;
        }
        // rewind(fp);        //把指针指向文件最开始位置
    
        fclose(fp);
    
        if ((fp = fopen(filename, "rb")) == NULL)
        { // 不可以以二进制方式读文件
            fprintf(stderr, "Can't write the file %s .\n", filename);
            exit(EXIT_FAILURE);
        }
    
        for (int i = 0; i < num; i++)
        {
            double temp;
            //long offsets = (long)i * sizeof(double);
            //fseek(fp, offsets, SEEK_SET);
            fread(&temp, sizeof(double), 1, fp); // 读文件
            printf("%lf\n", temp);
            sum += temp;
        }
    
        fclose(fp);
    
        if (num > 0)
        {
            printf("算数平均数为:%f\n", sum / num);
        }
        else
        {
            fprintf(stderr, "zero\n");
        }
    
        return 0;
    }
    
    char *s_gets(char *st, int n)
    {
        char *ret_val;
        char *find;
        printf("Input filename:");
        ret_val = fgets(st, n, stdin);
        if (ret_val)
        {
            find = strchr(st, '\n');
            if (find)
            {
                *find = '\0';
            }
            // else
            // {
            //     while (getchar() != '\n')
            //     { // 清空标准输入缓冲区数据
            //         continue;
            //     }
            // }
            fflush(stdin);
        }
        return ret_val;
    }
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月13日
  • 已采纳回答 4月13日
  • 修改了问题 4月13日
  • 修改了问题 4月13日
  • 展开全部

悬赏问题

  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥15 python爬取bilibili校园招聘网站
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度