簡體   English   中英

C:使用fgetc()解析文件-EOF無限循環

[英]C: Parsing a file with fgetc() - EOF infinite loop

大家好@Stackoverflow,

目前,我正在嘗試為.obj文件格式編寫一個簡單的解析器,但是在讀取了file.txt中的最后一條注釋后,解析器陷入了無限循環。 但這也發生在兩者之間。

解析器應執行以下操作:

如果當前字符是“#”,則應打印“ 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\n", currentChar);
        switch(currentChar)
        {
            case '#':
                {
                    printf("COMMENT\n");
                    currentChar=fgetc(file); //Read Whitespace 1x
                    while(currentChar!='\n')
                        currentChar=fgetc(file);
                    break;
                }
            case 'v':
                {
                    printf("VERTEX\n");
                    currentChar=fgetc(file); //Read Whitespace 1x
                    while(currentChar!='\n')
                        currentChar=fgetc(file);
                    break;
                }
            }
    }

    return 0;
}

我仍然看不到問題出在哪里。

真誠的,有毒的

看起來它在等待換行符時陷入困境。 開關盒內的回路可能是罪魁禍首。 將循環更改為:

    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;
}

這很大程度上取決於您的原始代碼。 所有評論都是我的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM