我有数据文件,其中一个看起来像这样:
所有文件中都有" NA" s。我需要阅读这些文件并找到第二列上的数字的平均值,忽略了" NA"那些。我想写一个C代码。我制作了一个如下所示的测试数据文件:
我写了这个测试代码:
#include<stdio.h>
int main()
{
FILE *f = fopen("a.txt", "r");
int num1, num2;
int i;
char c;
int count = 0;
double avg = 0.0;
c = fgetc(f);
while(c = fgetc(f) != EOF)
{
if(c != 'N' || c != 'A')
{
fscanf(f, "%d %d", &num1, &num2);
count += 1;
avg = avg + num2;
printf("%d\n", num2);
}
}
fclose(f);
avg = avg/count;
printf("Avg = %g\n", avg);
}
此代码未提供所需的输出。所以我想要的是上面数据文件的num2(数据文件的第二列)看起来像这样,忽略&#34; NA&#34; :
1
9
16
如何编写 C 代码来执行此任务?
答案 0 :(得分:0)
您的代码中存在一些问题,如评论中已提到的那样。我看到的主要(概念)事情是你用fgetc
读取单个字符(并做一些测试),然后使用fscanf
。对我来说,目前尚不清楚你对这种混合物的意图;也许你混淆了fgetc
和fgets
。
无论如何,如果文件只包含两列的行,你可以继续使用单个fscanf
循环 - 以两个值读取的语句。要将NA
与实际值区分开来,您可以先将值作为字符串读入,并仅在不等于"NA"
时将其转换。请参阅以下代码说明此方法。请注意"%*d"
,它使用整数值但不存储它(如格式中的*
所示)。因此,如果fscanf("%*d %s",...)
可以跳过整数值并且它可以读取字符串值,则1
将返回"%s"
。请进一步注意"NA"
会跳过任何前导空格,以便您可以实际将值与int main(){
FILE *f = fopen(DATAFILE,"rt");
if (f) {
char valueStr[100];
double sum = 0;
int count = 0;
while (fscanf(f,"%*d %99s", valueStr) == 1) {
if (strncmp(valueStr,"NA",2)==0)
continue;
double value = strtod(valueStr, NULL);
sum += value;
count++;
}
printf("scanned %d valid lines; average: %lf\n", count, sum/count);
}
}
进行比较:
List<ProductItem>