我已经在这段代码中待了半天了,我仍然无法让它工作。
while(fscanf(file, "%d {", ¯oList[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 %[^{]{", ¯oList[count]) == 2)
但输出相同。
感谢任何帮助,谢谢。
我希望格式化不会太混乱,第一次使用它。
编辑:我忘了提到,虽然,文件完全一样,但它对我不起作用,文件的真实格式是这样的1{ D,DL,L }2{ _D W52 ^DL. 123 }
。因此,任何数量的任何内容都可以在括号内。
答案 0 :(得分:3)
更改
fscanf(file, "%d {", ¯oList [count])
要
fscanf(file, "%d {%*[^}]}", ¯oList [count])
此处,%d
扫描int
并将其存储在macroList[count]
的地址中,然后格式字符串中的空格需要任意数量的空白字符(空格,换行符等),包括没有。然后,fscanf
扫描{
,然后扫描并丢弃所有内容,直到找到}
(%[^}]
),最后扫描}
。< / p>
您的代码不适用于第一次迭代,因为"%d {"
,首先需要int
,然后是任意数量的空白字符,包括无和开括号({
)。这对于第一次运行是可以的,但对于其余的迭代则没有,因为要扫描的下一件事是" D }"
,这与格式字符串"%d {"
不匹配。
请注意,如果{
和}
之间没有任何内容,则从文件中提取数据的上述方法将失败(第一次迭代除外)。因此,请在下面的评论中使用以下as suggested by @chux:
fscanf(file, "%d {%*[^}]" ,¯oList [count]);
fscanf(file, "}");
答案 1 :(得分:1)
当您使用"%d {"
时,您将阅读int
,然后是空白和开放式备忘录。这就是为什么你的第一个输出是正确的。之后,将使用相同的命令继续读取文件,但现在要读取的字符串是" D }"
,即空白,大写&#39; D&#39;和结束括号,绝不是你真正想要的。
在"%d { D }"
内使用fscanf
来修复您的问题,因为这正是重复模式:它会读取int
,空格,左括号,另一个空格, &#39; D&#39;,最终的空白,然后是结束括号。另外,请记住正确使用fopen
和fclose
函数。