例如,我正在尝试从文本文件中获取总年龄,该文本文件用分号分隔,格式为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;
}
但是由于它没有用分号隔开,所以它不起作用。我不确定如何更改它。有关如何执行的任何线索?
答案 0 :(得分:1)
您的代码中有很多问题:
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;
}