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