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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C:使用fgetc()解析文件 - EOF无限循环相关的知识,希望对你有一定的参考价值。

各位大家好@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 <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
", 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 != '
')

以上是关于C:使用fgetc()解析文件 - EOF无限循环的主要内容,如果未能解决你的问题,请参考以下文章

fgetc 无法识别 EOF [重复]

c语言 如何读取中文字符串

C语言问题 怎样从一个文件中逐个读入字符(每次读入一个)

EOF是什么

C语言 fgetc 文件的读操作

如何实现C语言中复制文件的程序