2013-03-11 80 views
0

我有这个家庭作业的分配,我必须从一个文件逐一读取行,然后解析它。用fgets读取一行文件,用C中的sscanf解析一个文件?

该文本文件如下所示:行数因文件而异。

NGM8 Nguyen, Michael; 25 30 45 20 
SIS7 Sinn, Scott; 30 25 20 21 
SMJ0 Smith, Jacob; 27 25 24 26 
.....etc 

其中第一列是人的ID,接下来就是名称,并在最后四个数字是每周销售数字为4周。

我的代码段读取这个文件是:

char id[5]; 
char name[50]; 
int i1, i2, i3, i4; 
fgets(temp, sizeof(temp), infile); // where infile is the file pointer passed to this function from main. The file opened successfully in main. 


sscanf(temp, "%s %s; %d %d %d %d", id, name, &i1, &i2, &i3, &i4); 
printf("id=%s name=%s sales: %d %d %d %d\n", id, name, i1, i2, i3, i4); 

这是基于上述的printf屏幕输出:

id=2685531 name=Johnson, sales: 0 16777216 0 7557016 

有人可以帮助我? sscanf语句应该如何正确读取这些变量的值?

谢谢。

+0

函数'scanf()'系列中的'%s'说明符在遇到的下一个空白处终止扫描。另外,打印时,使用'%d'格式化'char [5]'变量是没有意义的。 – 2013-03-11 05:58:08

+0

感谢您的反馈。对不起printf中的输入错误。我修正了这一点。 那么如何读取格式为“姓氏,名字”的名称?用sscanf?我如何让sscanf不跳过最后名字和名字之间的空格,而是跳过行中其他任何地方的空格? – user2155560 2013-03-11 16:00:16

回答

2

正如我在评论中提到的那样,%s说明符会读取直到空白或数据结束。所以如果你想读一个由​​3210字符分隔的字符串标记,你需要使用别的东西。幸运的是,%[说明符可让您提供一组字符来接受或更常用 - 一组字符来停止匹配。

尝试以下方法:

sscanf(temp, "%s %[^;]; %d %d %d %d", id, name, &i1, &i2, &i3, &i4); 
//    ^^^^^ 

第二令牌(其对应于名称),直到它碰到一个分号(和将离开输入流中的分号将读取的字符 - 因此字面;下列它消耗那个角色)。我不是一个用scanf()函数解析数据的巨大粉丝 - 处理错误,角落情况以及确保不超过字符串的缓冲区边界可能会非常棘手。但是他们通常应该对作业分配或者当你确实有一个固定格式输入文件的时候没问题。

+0

好吧,我明白了。 真棒!这解决了我的问题。非常感谢你的帮助。 – user2155560 2013-03-12 02:15:00