输出得不到想要的结果

输出的算数平均数永远为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;
}

简单修改了下。


#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