我正在编写一个使用C的程序,只是为了从我的输入文件中找到包含大约500个浮动数字(如54.54)的最大和最小数字。我可以让程序运行,但输出显示我的min是0,我的最大值是54.88,这是文件中的第一个数字。 这是我到目前为止所做的。
#include <stdio.h>
int main(int argc, const char * argv[])
{
FILE * fp;
fp=fopen("file.txt","r");
if (fp==NULL)
{
printf("Failed to open");
}
float i;
float min ;
float max ;
{
fscanf( fp, "%f", &i);
if (i < min)
min = i;
if (i > max)
max = i;
}
printf("Data range is: %f %f \n", min, max);
return 0;
}
答案 0 :(得分:1)
应将最小值/最大值初始化为适当的值。例如。
float inf = 1.0 / 0.0; // also in math.h as INFINITY?
float max = -inf;
float min = inf;
float i;
另一种选择是将min和max初始化为从文件读取的第一个值。这是编写循环的一种方法:
while (fscanf(fp, "%f", &i)==1) //
{
...
}
答案 1 :(得分:1)
该计划符合该法案。
#include <stdio.h>
int main()
{
float num;
float min = 999.99; /*Max value of number your file will not exceed*/
float max = 0;
int i = 0;
FILE *fp;
fp = fopen("file.txt", "r");
while(fscanf(fp,"%f",&num) == 1)
{
if (num < min)
min = num;
if (num > max)
max = num;
}
fclose(fp);
printf("Data range is: %f %f \n", min, max);
return 0;
}
答案 2 :(得分:1)
保留大部分代码:
#include <stdio.h>
int main(int argc, const char * argv[])
{
float i=0, min=0, max=0;
FILE * fp fp=fopen("file.txt","r");
if (fp==NULL)
{
perror("Failed to open file.");
return EXIT_FAILURE;
}
if (fscanf(fp,"%f", &i) == 1)
{
min = max = i;
while (fscanf( fp, "%f", &i) == 1)
{
if (i < min)
min = i;
else if (i > max)
max = i;
}
}
printf("Data range is: %f %f \n", min, max);
return 0;
}
对不起打字错误。
答案 3 :(得分:0)
您没有读取文件中所有数字的循环。你得到的只是第一个。
答案 4 :(得分:0)
如果你知道每条线上只有一个双,那么这是你可以做到的一种方式。它可能不是最优雅的,但在我脑海中编译它似乎可以完成工作。
(我没有对此代码进行错误测试,而且我也不确定这是否是最大和最小双值的正确宏)
char buf[10]; /* as big as the biggest number */
char c;
int i = 0;
double d, dmax = -INFINITY, dmin = INFINITY;
while ((c = getc(fp)) != EOF) {
if (c != '\n')
buf[i++] = c;
else {
buf[i] = '\0';
d = atof(buf);
if (d > dmax) dmax = d;
if (d < dmin) dmin = d;
i = 0;
}
}