【问题标题】:Read a file line by line with fgets an parse with sscanf in C?在 C 中使用 fgets 使用 sscanf 逐行读取文件?
【发布时间】:2013-03-11 05:48:05
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • %s 说明符在 scanf() 系列函数中会在遇到下一个空格时终止扫描。此外,在打印时,使用%d 格式化char [5] 变量是没有意义的。
  • 感谢您的反馈。抱歉,printf 中的错字。我修好了。那么如何读取格式为“姓氏,名字;”的名称?与 sscanf?如何使 sscanf 不跳过姓氏和名字之间的空格,而是跳过该行其他任何地方的空格??

标签: fgets scanf


【解决方案1】:

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

尝试以下方法:

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

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

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

【讨论】:

  • 好的,我明白了。太棒了!这解决了我的问题。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多