如何使用fscanf读取以分号分隔的行[复制]

问题描述 投票:0回答:2

这个问题在这里已有答案:

例如,我试图从以分号分隔的文本文件中获取总年龄,格式为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;
}

但是由于它没有用分号分隔空间,所以它不起作用。我不知道如何改变它。关于怎么做的任何线索?

c scanf
2个回答
2
投票

您的代码几乎没有问题。首先建议检查fopen()的返回值,例如这个

fp = fopen(in_file,"r");

应该

fp = fopen(in_file,"r");
if(fp == NULL) {
   /* error handling @TODO */
} 

其次,fscanf()参数不正确,肯定编译器产生警告,但似乎你忽略了它们。这个

while(fscanf(fp,"%c %f %f", &name, &age, &fav_number) != EOF) { /* read the name from file & store into name i.e it should be &name if name is char variable */
      fscanf(fp,"%c %f %f", &name, &age, &fav_number);
      sum += age;
}

最后,如果你想读取以分号分隔的行,那么使用%[^;]或使用strtok()。或者最好首先使用fgets()读取整行,然后使用strtok()。要了解strtok()的工作原理,请阅读手册页strtok


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;
}
© www.soinside.com 2019 - 2024. All rights reserved.