如何编写C代码以从包含数字和字符串的数据文件中读取数字

时间:2017-07-29 19:54:50

标签: c

我有数据文件,其中一个看起来像这样:

enter image description here

所有文件中都有" NA" s。我需要阅读这些文件并找到第二列上的数字的平均值,忽略了" NA"那些。我想写一个C代码。我制作了一个如下所示的测试数据文件:

enter image description here

我写了这个测试代码:

       #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 代码来执行此任务?

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题,如评论中已提到的那样。我看到的主要(概念)事情是你用fgetc读取单个字符(并做一些测试),然后使用fscanf。对我来说,目前尚不清楚你对这种混合物的意图;也许你混淆了fgetcfgets

无论如何,如果文件只包含两列的行,你可以继续使用单个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>