各位大家好@Stackoverflow,
目前我正在尝试为.obj文件格式编写一个简单的解析器,但是在我读取file.txt中的最后一条注释后,我的解析器在某种程度上陷入无限循环。但它也发生在中间。
解析器应该执行以下操作:
如果当前char是'#',它应该打印“COMMENT”并跳过这一行,如果它是'v',它应该打印“VERTEX”并跳过该行。
即使我使用调试器逐步执行代码,我仍然无法找到问题。
file.txt的:
# Comment1
# Comment2
# Comment3
v Vertex1
# Comment4
码:
int main()
{
FILE *file = fopen("file.txt", "r");
if(file==NULL)
{
return -1;
}
int currentChar=0;
while(currentChar!=EOF)
{
currentChar=fgetc(file);
printf("CURR CHAR: %c
", currentChar);
switch(currentChar)
{
case '#':
{
printf("COMMENT
");
currentChar=fgetc(file); //Read Whitespace 1x
while(currentChar!='
')
currentChar=fgetc(file);
break;
}
case 'v':
{
printf("VERTEX
");
currentChar=fgetc(file); //Read Whitespace 1x
while(currentChar!='
')
currentChar=fgetc(file);
break;
}
}
}
return 0;
}
我仍然看不出问题出在哪里。
真诚,有毒
答案
你可能想要这个:
#include
int main()
{
FILE *file = fopen("file.txt", "r");
if (file == NULL)
{
return -1;
}
int currentChar = 0;
while (currentChar != EOF)
{
currentChar = fgetc(file);
if (currentChar == EOF) // if EOF stop loop immediately,
// it's pointless to continue
break;
printf("CURR CHAR: %c
", currentChar);
switch (currentChar)
{
case '#':
{
printf("COMMENT
");
currentChar = fgetc(file);
while (currentChar != EOF && currentChar != '
') // skip until
or EOF
currentChar = fgetc(file);
break;
}
case 'v':
{
printf("VERTEX:
currentChar = fgetc(file);
while (currentChar != EOF && currentChar != '
') // read until
or EOF
{
printf("%c", currentChar);
currentChar = fgetc(file);
}
printf(">
");
break;
}
}
}
return 0;
}
它主要基于您的原始代码。所有评论都是我的。
另一答案
它看起来像是在等待换行符。你的开关盒内的循环可能是罪魁祸首。将你的循环改为:
while(currentChar != EOF && currentChar != '
')