我有以下程序:
#include <stdio.h> // printf, scanf definitions //
#include <math.h> // sqrt function //
int main(void)
{
double number; // input- a number of a set //
double avg; // output - average //
double sdev; // output - standard deviation //
double numSq; // output - input squred //
int count = 0; // number of numbers counter //
int status; // status of scanf function //
avg = 0;
numSq = 0;
do{
status = scanf("%lf", &number);
// Testing Purposes //
// printf("%f\n", number);
if (status == 1 && number !=EOF)
{
if ( number >=0)
{
avg += number;
numSq += number * number;
count +=1;
}
else if( number <0)
{
avg -= number;
numSq += (number * number);
count +=1;
}
}
// Make an else for negative numbers and if scanf fails //
}
while (number !=EOF );
avg = avg / count;
numSq = numSq / count;
sdev = sqrt(numSq - (avg * avg));
printf("The average is %.4f \n", avg);
printf("The standard deviation is %.4f \n", sdev);
return 0;
}
我还有一个名为data.txt
的文本文件,其中包含:
1.0
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0
程序编译后,我运行:
./standard < data.txt > results.txt
但没有任何反应!带有闪烁点的空白终端,如下图所示:
我的猜测是程序卡在循环中,但为什么呢?我该如何解决这个问题?
答案 0 :(得分:2)
1.我们可以找到文件的位置结尾但无法检索文件结尾的值。 2.我们可以使用scanf系列函数的返回状态。在你的情况下我们应该运行循环状态!= - 1。 3.我们可以使用scanf读取重定向文件的输入。 4.以下代码可以帮助你。
#include <stdio.h> // printf, scanf definitions //
#include <math.h> // sqrt function //
int main(void)
{
double number=0; // input- a number of a set //
double avg; // output - average //
double sdev; // output - standard deviation //
double numSq; // output - input squred //
int count = 0; // number of numbers counter //
int status; // status of scanf function //
avg = 0;
numSq = 0;
FILE *fp=NULL;
fp=fopen("data.txt","r");
do{
//status = scanf("%lf", &number);
status=fscanf(fp,"%lf", &number);
printf("status:%d number:%lf\n",status,number);
sleep(1);
// Testing Purposes //
// printf("%f\n", number);
if (status == 1 && number !=EOF)
{
if ( number >=0)
{
avg += number;
numSq += number * number;
count +=1;
}
else if( number <0)
{
avg -= number;
numSq += (number * number);
count +=1;
}
}
// Make an else for negative numbers and if scanf fails //
}
while (status !=-1 );
avg = avg / count;
numSq = numSq / count;
sdev = sqrt(numSq - (avg * avg));
printf("The average is %.4f \n", avg);
printf("The standard deviation is %.4f \n", sdev);
return 0;
}
答案 1 :(得分:1)
您在number
和EOF
之间的比较没有意义,如果到达文件末尾,scanf
将不会将number
设置为任何特定值。相反,它将返回 EOF
。
因此,您应该测试以确定文件结尾为status == EOF
。
事实上,如果status != 1
,你可能应该突破循环,因为这意味着文件的结尾或者提供了无效的输入。在后一种情况下尝试并进行适当的错误报告。