【发布时间】:2010-09-30 09:14:28
【问题描述】:
我正在尝试使用 fscanf 解析文本 (CSS) 文件并提取与此模式匹配的所有语句:
@import "some/file/somewhere.css";
为此,我设置了以下循环:
FILE *file = fopen(pathToSomeFile, "r");
char *buffer = (char *)malloc(sizeof(char) * 9000);
while(!feof(file))
{
// %*[^@] : Read and discard all characters up to a '@'
// %8999[^;] : Read up to 8999 characters starting at '@' to a ';'.
if(fscanf(file, "%*[^@] %8999[^;]", buffer) == 1)
{
// Do stuff with the matching characters here.
// This code is long and not relevant to the question.
}
}
只要文件中的第一个字符不是“@”,它就可以完美运行。 (从字面上看,CSS 文件中第一个“@”字符前的一个空格将使代码运行良好。)
但是如果 CSS 文件中的第一个字符是'@',那么我在调试器中看到的是一个无限循环——执行进入 while 循环,命中 fscanf 语句,但没有进入 'if ' 语句(fscanf 失败),然后永远继续循环。
我相信我的 fscanf 格式化程序可能需要一些调整,但我不确定如何进行。关于为什么会发生这种情况的任何建议或解释?
谢谢。
【问题讨论】:
-
您的字符串开头似乎缺少
%。这是复制粘贴错误,还是错误? -
哎呀。我在尝试用格式化程序诊断问题时删除了第一个 %。我已经把它放回了上面的代码中,但是它的存在并不能解决问题。
-
这个问题既不是关于objective-c也不是关于cocoa。所以你应该删除这些标签。
-
对 Bryan 的不相关建议:将
// This code is long and ...替换为设置一些变量并调用一两个函数 -
不要使用
scanf编写解析器。