如何正确使用fscanf?

时间:2015-03-06 02:21:03

标签: c scanf

我已经在这段代码中待了半天了,我仍然无法让它工作。

while(fscanf(file, "%d {", &macroList[count]) == 1)
{
    count++;
}

for(count = 0; count < sizeof macroList/sizeof(macroList[0]); count++)
{
    printf("%d ", macroList[count]);
}

我的文件如下:

1{ D }2{ D }3{ D }4{ D }5{ D }6{ D }7{ D }8{ D }9{ D }10{ D }11{ D }12{ D }13{ D }14{ D }15{ D }16{ D }17{ D }18{ D }19{ D }20{ D }21{ D }22{ D }23{ D }24{ D }

我的输出是:

1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

我希望它是这样的:

1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 23 24

我的问题是,为什么fscanf只能抓住&#34;第一个条目&#34;我该如何解决?此fscanf的一个版本将捕获整数和左括号之间的任何白色空间将不胜感激。我有这个

while(fscanf(file, "%d %[^{]{", &macroList[count]) == 2)

但输出相同。

感谢任何帮助,谢谢。

我希望格式化不会太混乱,第一次使用它。

编辑:我忘了提到,虽然,文件完全一样,但它对我不起作用,文件的真实格式是这样的 1{ D,DL,L }2{ _D W52 ^DL. 123 }。因此,任何数量的任何内容都可以在括号内。

2 个答案:

答案 0 :(得分:3)

更改

fscanf(file, "%d {", &macroList [count])

fscanf(file, "%d {%*[^}]}", &macroList [count])

此处,%d扫描int并将其存储在macroList[count]的地址中,然后格式字符串中的空格需要任意数量的空白字符(空格,换行符等),包括没有。然后,fscanf扫描{,然后扫描并丢弃所有内容,直到找到}%[^}]),最后扫描}。< / p>

您的代码不适用于第一次迭代,因为"%d {",首先需要int,然后是任意数量的空白字符,包括无和开括号({)。这对于第一次运行是可以的,但对于其余的迭代则没有,因为要扫描的下一件事是" D }",这与格式字符串"%d {"不匹配。

请注意,如果{}之间没有任何内容,则从文件中提取数据的上述方法将失败(第一次迭代除外)。因此,请在下面的评论中使用以下as suggested by @chux

fscanf(file, "%d {%*[^}]" ,&macroList [count]);
fscanf(file, "}");

答案 1 :(得分:1)

当您使用"%d {"时,您将阅读int,然后是空白和开放式备忘录。这就是为什么你的第一个输出是正确的。之后,将使用相同的命令继续读取文件,但现在要读取的字符串是" D }",即空白,大写&#39; D&#39;和结束括号,绝不是你真正想要的。

"%d { D }"内使用fscanf来修复您的问题,因为这正是重复模式:它会读取int,空格,左括号,另一个空格, &#39; D&#39;,最终的空白,然后是结束括号。另外,请记住正确使用fopenfclose函数。