如何使用fscanf读取以分号分隔的行

时间:2018-09-12 05:29:59

标签: c scanf

例如,我正在尝试从文本文件中获取总年龄,该文本文件用分号分隔,格式为Name;Age;Favorite Number

Jack;12;3
Red;21;15
Blue;14;6

我试图做这样的事情。

File *fp;
fp = fopen(in_file,"r");
int sum = 0, age = 0, fav_number = 0;
while (fscanf(fp,"%c %f %f", name, age, fav_number) != EOF) {
    fscanf(fp, "%c %f %f", name, age, fav_number);
    sum += age;
}

但是由于它没有用分号隔开,所以它不起作用。我不确定如何更改它。有关如何执行的任何线索?

1 个答案:

答案 0 :(得分:1)

您的代码中有很多问题:

  • File应该是FILE
  • 您应该测试fopen()的返回值
  • fscanf()的格式字符串不正确:%c仅读取一个字符,%f需要指向float的指针,而您需要提供一个int值...
  • 您应该将fscanf()的返回值与预期的转换次数(代码中的3)进行比较,而不是EOF进行比较,如果没有转换则仅在文件末尾返回执行。
  • 您两次致电fscanf()

由于您对NameFavorite colour字段不感兴趣,因此可以忽略它们:

#include <stdio.h>

int main() {
    char in_file[] = "test.csv";
    FILE *fp;
    fp = fopen(in_file, "r");
    if (fp != NULL) {
        double sum = 0, age = 0;
        while (fscanf(fp," %*[^;];%lf;%*lf", &age) == 1) {
            sum += age;
        }
        fclose(fp);
        printf("total of ages: %g\n", sum);
    }
    return 0;
}

但是请注意,一次读取一行输入文件并用sscanf()进行解析会更可靠:

#include <stdio.h>

int main() {
    char buf[256];
    char in_file[] = "test.csv";
    double sum = 0, age = 0;
    FILE *fp;

    fp = fopen(in_file, "r");
    if (fp == NULL) {
        fprintf(stderr, "cannot open input file %s\n", in_file);
        exit(1);
    }
    while (fgets(buf, sizeof buf, fp)) {
        if (sscanf(buf,"%*[^;];%lf;%*lf", &age) == 1) {
            sum += age;
        } else {
            fprintf(stderr, "invalid data: %s\n", buf);
            fclose(fp);
            exit(1);
        }
    }
    fclose(fp);
    printf("total of ages: %g\n", sum);
    return 0;
}