C:使用fgetc()-EOF infinite循环解析文件
你好,everbody@Stackoverflow 目前,我正试图为.obj文件格式编写一个简单的解析器,但不知何故,我的解析器在读取了File.txt中的最后一条注释后陷入了无限循环。 但这也发生在两者之间 解析器应执行以下操作: 如果当前字符是“#”,则应打印“注释”并跳过此行;如果是“v”,则应打印“顶点”并跳过此行 即使我使用调试器逐步检查代码,我仍然找不到问题 file.txt:C:使用fgetc()-EOF infinite循环解析文件,c,parsing,infinite-loop,eof,fgetc,C,Parsing,Infinite Loop,Eof,Fgetc,你好,everbody@Stackoverflow 目前,我正试图为.obj文件格式编写一个简单的解析器,但不知何故,我的解析器在读取了File.txt中的最后一条注释后陷入了无限循环。 但这也发生在两者之间 解析器应执行以下操作: 如果当前字符是“#”,则应打印“注释”并跳过此行;如果是“v”,则应打印“顶点”并跳过此行 即使我使用调试器逐步检查代码,我仍然找不到问题 file.txt: # Comment1 # Comment2 # Comment3 v Vertex1 # Comment4
# Comment1
# Comment2
# Comment3
v Vertex1
# Comment4
代码:
我仍然看不出问题出在哪里
真诚地,
有毒的它看起来像是在等待换行符。开关盒内的回路可能是罪魁祸首。将循环更改为:
while(currentChar != EOF && currentChar != '\n')
它看起来像是在等待换行符。开关盒内的回路可能是罪魁祸首。将循环更改为:
while(currentChar != EOF && currentChar != '\n')
你可能想要这个:
#include <stdio.h>
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\n", currentChar);
switch (currentChar)
{
case '#':
{
printf("COMMENT\n");
currentChar = fgetc(file);
while (currentChar != EOF && currentChar != '\n') // skip until \n or EOF
currentChar = fgetc(file);
break;
}
case 'v':
{
printf("VERTEX: <");
currentChar = fgetc(file);
while (currentChar != EOF && currentChar != '\n') // read until \n or EOF
{
printf("%c", currentChar);
currentChar = fgetc(file);
}
printf(">\n");
break;
}
}
}
return 0;
}
#包括
int main()
{
FILE*FILE=fopen(“FILE.txt”、“r”);
if(file==NULL)
{
返回-1;
}
int currentChar=0;
while(currentChar!=EOF)
{
currentChar=fgetc(文件);
if(currentChar==EOF)//如果EOF立即停止循环,
//继续下去是没有意义的
打破
printf(“当前字符:%c\n”,currentChar);
开关(currentChar)
{
案例“#”:
{
printf(“注释”);
currentChar=fgetc(文件);
while(currentChar!=EOF&¤tChar!='\n')//跳到\n或EOF
currentChar=fgetc(文件);
打破
}
案例“v”:
{
printf(“顶点:\n”);
打破
}
}
}
返回0;
}
它主要基于您的原始代码。所有的评论都是我的。你可能想要这个:
#include <stdio.h>
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\n", currentChar);
switch (currentChar)
{
case '#':
{
printf("COMMENT\n");
currentChar = fgetc(file);
while (currentChar != EOF && currentChar != '\n') // skip until \n or EOF
currentChar = fgetc(file);
break;
}
case 'v':
{
printf("VERTEX: <");
currentChar = fgetc(file);
while (currentChar != EOF && currentChar != '\n') // read until \n or EOF
{
printf("%c", currentChar);
currentChar = fgetc(file);
}
printf(">\n");
break;
}
}
}
return 0;
}
#包括
int main()
{
FILE*FILE=fopen(“FILE.txt”、“r”);
if(file==NULL)
{
返回-1;
}
int currentChar=0;
while(currentChar!=EOF)
{
currentChar=fgetc(文件);
if(currentChar==EOF)//如果EOF立即停止循环,
//继续下去是没有意义的
打破
printf(“当前字符:%c\n”,currentChar);
开关(currentChar)
{
案例“#”:
{
printf(“注释”);
currentChar=fgetc(文件);
while(currentChar!=EOF&¤tChar!='\n')//跳到\n或EOF
currentChar=fgetc(文件);
打破
}
案例“v”:
{
printf(“顶点:\n”);
打破
}
}
}
返回0;
}
它主要基于您的原始代码。所有注释都是我的。currentChar在转到while()之前未初始化。只需添加currentChar=fgetc(文件);在此之前,可能不是问题的原因,但在初始化之前测试
currentChar
是错误的。@shihabbullissery我也用int currentChar=0测试了它;在进入while循环之前。仍然卡在一个无限循环中。@t0XiC在(currentChar!='\n')currentChar=fgetc(文件)时将此代码删除;可以调用无限循环。解决方案可能是有限状态机。(需要4个状态中的3个)在转到while()之前未初始化currentChar。只需添加currentChar=fgetc(文件);在此之前,可能不是问题的原因,但在初始化之前测试currentChar
是错误的。@shihabbullissery我也用int currentChar=0测试了它;在进入while循环之前。仍然卡在一个无限循环中。@t0XiC在(currentChar!='\n')currentChar=fgetc(文件)时将此代码删除;可以调用无限循环。解决方案可能是有限状态机。(需要4个州中的3个)。。。应初始化currentChar
,例如:int currentChar=0代码>我尝试了这个,但它无法读取我的带有“v”的行。从文件中读取第一个“#”后,它会自动退出循环。txt@t0XiC当然,它不起作用,您没有编写读取vertext的代码line@t0XiC向我们展示一个可复制的示例,当您使用0@t0XiC你需要用有限状态机来解决这个问题,其他一切都会以眼泪结束。。。应初始化currentChar
,例如:int currentChar=0代码>我尝试了这个,但它无法读取我的带有“v”的行。从文件中读取第一个“#”后,它会自动退出循环。txt@t0XiC当然,它不起作用,您没有编写读取vertext的代码line@t0XiC向我们展示一个可复制的示例,当您使用0@t0XiC你需要用有限状态机来解决这个问题,其他的一切都将以眼泪告终。这是我的作品,我会努力去理解它,非常感谢(Vielen Dank!)!这几乎是您的原始代码,大致上您只是忘记了阅读v
之后的字符,我会尽力理解它,非常感谢(Vielen Dank!)!这几乎是您的原始代码,大致上您只是忘记了读取v