0

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

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

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 语句应该是什么样子才能正确读取这些变量的值?

谢谢。

4

1 回答 1

1

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

尝试以下操作:

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

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

FWIW,我不太喜欢用scanf()函数解析数据——处理错误、极端情况以及确保不超过字符串的缓冲区边界可能会很棘手。但它们通常适用于家庭作业或当您确实有固定格式的输入文件时。

于 2013-03-11T16:38:47.940 回答