我刚开始学习C(可选的学校课程)。我坚持了2天的小问题。所以基本的想法是,我在一个文件中有大量数据,我想提取。但是,数据有两种格式,每行的第一个字母决定了我需要采取的行动。
例如,文件中的数据如下所示:
S:John,engineer,male,30
S:Alice,teacher,female,40
C:Ford Focus,4-door,25000
C:Chevy Corvette,sports,56000
S:Anna,police,female,36
我想要做的是,打开文件后,读取每一行。如果第一个字母是S,则使用
fscanf(fp, "%*c:%[^,],%[^,],%[^,],%d%*c",name,job,sex,&age)
存储所有变量,以便我可以将它们传递给函数people()。
但如果第一个字母是C,那么使用
fscanf(fp, "%*c:%[^,],%[^,],%d%*c",car,type,&price)
存储所以我可以将它们传递给功能车辆()。
如果有人能给我指示如何做到这一点,我真的很感激。感谢。
答案 0 :(得分:1)
有许多方法,但将IO与解析分开是一个很好的第一步。
使用面向行的数据,简单地
就更清晰了FILE *inf = ...;
char buf[100];
if (fgets(buf, sizeof buf, inf) == NULL) Handle_EOForIOError();
然后解析它。
char name[sizeof buf];
char job[sizeof buf];
char sex[sizeof buf];
unsigned age;
char car[sizeof buf];
char type[sizeof buf];
unsigned cost;
int n;
if (sscanf(buf, "S:%[^,],%[^,],%[^,],%u %n", name, job, sex, &age, &n) == 4 &&
buf[n] == '\0')
Good_SRecord();
else if (sscanf(buf, "C:%[^,],%[^,],%u %n", car, type, &cost &n) == 3 &&
buf[n] == '\0')
Good_CRecord();
else Garbage();
" %n"
技巧非常擅长确保所有数据按预期解析而不会产生额外的垃圾。
答案 1 :(得分:0)
这是一个粗略的想法:分两步解析字符串:
"%c:%s"
将为您提供第一个字符和字符串的其余部分。然后,根据您在第一个字符中读取的内容,您可以继续将剩余部分解析为
"%[^,],%[^,],%[^,],%d%c"
或
"%c:%[^,],%[^,],%d%c"