这个问题在这里已有答案:
例如,我试图从以分号分隔的文本文件中获取总年龄,格式为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;
}
但是由于它没有用分号分隔空间,所以它不起作用。我不知道如何改变它。关于怎么做的任何线索?
您的代码几乎没有问题。首先建议检查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。
您的代码中存在许多问题:
File
应该是FILE
fopen()
的返回值fscanf()
的格式字符串不正确:%c
只读取一个字符,%f
需要指向float
的指针,而你提供int
值...fscanf()
的返回值与预期转换的数量(代码中的3
)进行比较,而不是EOF
,如果没有执行转换,则只返回文件末尾。fscanf()
两次。由于您对Name
和Favorite 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;
}