【问题标题】:Fscanf and delimitersFscanf 和分隔符
【发布时间】:2013-07-08 08:37:39
【问题描述】:

我正在尝试从 C 中的文件中读取数据,该文件将始终以这种类型的行格式化:

16 Oct 2013 00:01:00.000,0.000,0.000000

这是一个字符串、一个逗号、一个浮点数、一个逗号、一个浮点数和一个\n

我遇到了一些奇怪的事情,我开始尝试只使用字符串,然后我意识到:

fscanf(filefd, "\n%24[^,]s", data);
fscanf(filefd, ",%5s", data2);

fscanf(filefd, "\n%24[^,]s,", data);
fscanf(filefd, "%5s", data2);

fscanf(filefd, "\n%24[^,]s,%5s", data, data2);

为什么第一个案例有效而其他两个无效?如果我将逗号放在变量之前,在格式字符串的开头,它可以工作。如果我将逗号放在其他格式字符串中,但最后,我会在data2 中得到逗号。最后,如果我把它们放在一起,data2 没有任何有效数据,但data 有。

我是否错过了一些东西来获得这种奇怪的行为?

【问题讨论】:

  • Sergey,谢谢指正,我不是英语母语,经常出错!

标签: c delimiter scanf


【解决方案1】:

%[] 的相应参数类型已经是一个字符串,因此 ] 之后的尾随 s 不需要指示字符串目标,因此预计会出现在输入流中。在所有情况下,输入在] 之后都会停止使用,因为s 不存在,而将, 留在输入流中。

第一个 sn-p 有效,因为它独立于 ]s 处理 ,,最后两个 sn-p 没有,因此失败,因为 s, 没有出现在输入流中。

始终检查fscanf() 的返回值以确定成功分配的次数。

【讨论】:

  • 昨天一个简单的额外s让我发疯了。如此简单,现在可以按预期完美运行。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多