我确实练习了“c引物+”第13.10-4章:编写了一个不接受命令行参数或一个命令行参数的程序。如果有,将其解释为文件名;如果没有参数,则使用标准输入(stdin)作为输入。假设输入是一个浮点数。该程序用于计算和报告输入数字的算术平均值。
结果
标准输入的部分可以很好地工作,但当使用cmd写入和读取文件时,平均值为"nan“。

环境
我使用win10,最新版本的Visual
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
double ch;
double numbers[12];
FILE* fp;
double average=0;
int i = 0;
if (argc==1)
{
printf("enter double, end with q\n");
while (scanf_s("%lf", &ch))
{
average += ch;
printf("%lf\n", ch);
i++;
}
}
else
{
for (int j = 0; j < 12; j++)
numbers[j] = 10.1 * j;
fopen_s(&fp, argv[1], "wb");
fwrite(numbers, sizeof(double), 10, fp);
fclose(fp);
if ((fopen_s(&fp, argv[1], "rb")!=0))
{
fprintf(stdout,"cant find %s\n", argv[1]);
exit(EXIT_FAILURE);
}
while (fseek(fp, (long)i * sizeof(double), SEEK_SET)!=0)
{
fread(&ch, sizeof(double), 1, fp);
fprintf(stdout, "ch\n");
average += ch;
i++;
}
fclose(fp);
}
printf("average is %lf\n", average/i);
return 0;
}发布于 2022-09-06 12:18:07
您对fseek()使用了错误的测试
while (fseek(fp, (long)i * sizeof(double), SEEK_SET)!=0)手册页态
返回值。 如果成功,
fseek和_fseeki64将返回0。
但是,即使您将!=0更改为==0,它仍然是错误的,因为手册页还说
指针也可以定位在文件末尾之后。
因为文件读取是连续的,所以可以将循环简化为
while (fread(&ch, sizeof(double), 1, fp) == 1)
{
fprintf(stdout, "ch\n");
average += ch;
i++;
}您还忽略了对文件输入的必要检查:忽略了来自fread()的返回值。
https://stackoverflow.com/questions/73621456
复制相似问题