C:使用fgetc()-EOF infinite循环解析文件

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

你好,everbody@Stackoverflow

目前,我正试图为.obj文件格式编写一个简单的解析器,但不知何故,我的解析器在读取了File.txt中的最后一条注释后陷入了无限循环。 但这也发生在两者之间

解析器应执行以下操作:

如果当前字符是“#”,则应打印“注释”并跳过此行;如果是“v”,则应打印“顶点”并跳过此行

即使我使用调试器逐步检查代码,我仍然找不到问题

file.txt:

# 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