逐行读取文件fgets与C中的sscanf解析?

时间:2013-03-11 05:48:05

标签: fgets scanf

我有这个家庭作业,我必须从文件中逐个读取行,然后解析它。

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

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语句应该如何正确读取这些变量的值?

感谢。

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,%s说明符会一直读到空格或数据结尾。因此,如果您想要读取由';'字符分隔的字符串标记,则您需要使用其他内容。幸运的是,%[说明符允许您提供一组字符来接受或者 - 更常用的 - 一组字符来阻止匹配。

尝试以下方法:

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

第二个标记(对应于名称)将读取字符,直到它到达分号(并且将分号留在输入流中 - 因此在其后面的文字;使用该字符)。

FWIW,我不是用scanf()函数解析数据的忠实粉丝 - 处理错误,极端情况并确保不超过缓冲区边界可能很棘手字符串。但是它们通常应该适用于家庭作业,或者当你确实有固定格式的输入文件时。