计算来自C中的CSV文件的值的平均值



我正在编写一段代码,其中读取CSV文本文件,该文件在命令行中作为参数提供。我必须计算给定文件的实验的平均值:
例如,如果文件是

Bob's experiment,12,33,55,8
Mary's experiment,99,21,12,0

我必须打印出来鲍勃的实验(数的平均值)玛丽实验(数的平均值)

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#include<string.h>
int main (int argc, char *argv[]){
FILE* ptr=fopen(argv[1], "rt");
int i=0;
double sum=0;
double count=0;
double ave=0;
if (ptr==NULL){
    perror("Error while opening file");
    exit(EXIT_FAILURE);   
}
while(!feof(ptr)){
                char s='a';
                while(s!=','){
                             s=fgetc(ptr);
                              printf("%c", s);
                  }
                while((char) *ptr)!='n'){
                                    fscanf(ptr, "%d", &i);
                                    sum+=i;
                                    count++;
                  }
                    ave=sum/count;
                    printf("%.2f", ave);
            }
        fclose(ptr);
}

}

我得到了一个奇怪的无限循环类型的结果。请告诉我我做错了什么!

}

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main (int argc, char *argv[]){
    FILE* ptr=fopen(argv[1], "rt");
    double sum, count, ave;
    int i=0;
    if (ptr==NULL){
        perror("Error while opening file");
        exit(EXIT_FAILURE);
    }
    while(1){
        int s;
        while((s=fgetc(ptr)) != ',' && s != EOF){
            printf("%c", s);
        }
        if(s == EOF)
            break;
        printf("t");
        count = sum = 0;
        while(1==fscanf(ptr, "%d%*c", &i)){//%*c skip ',' and 'n'
            sum += i;
            count++;
        }
        ave = sum / count;
        printf("%.2fn", ave);
    }
    fclose(ptr);
    return 0;
}

正如上面的注释所示,检查FILE*指针中字符值的语法无效。您可以替换((char)ptr*!='\n')与(fgetc(ptr)!='\n')


另外,使用类似这样的双嵌套循环进行解析通常是糟糕的设计,而且很难调试。无限循环可能是由许多角落的情况引起的(例如,在你读了最后一行之后?)。我建议有一个单独的while循环,每个情况下都有内部条件,例如:

while(!feof(ptr)) {
    char s = fgetc(ptr);
    if(s == 'n') {
       ...
    } else if(s == ',') {
       ...
    } else {
       ...
    }
}

多个循环只会增加复杂性,因此最好避免。


如果你绝对必须使用上述算法,你可以在保护程序中编程来检测超时,例如:

int timeout = 0;
while(s!=',' && timeout < 500) {
    ...
    timeout++;
}
if(timeout >= 500) {
   printf("First loop timeout, s:%cn", s);
   ... some other useful state checking if you wish..
}

通过这种方式,您可以轻松地检测哪个循环将进入无限循环,并确定变量在该点的状态。

相关内容

  • 没有找到相关文章

最新更新