在C中每行读取不同格式的文件

时间:2014-04-11 00:12:21

标签: c

我刚开始学习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)
存储所以我可以将它们传递给功能车辆()。

如果有人能给我指示如何做到这一点,我真的很感激。感谢。

2 个答案:

答案 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"