C: 使用 fgetc() 解析文件 - EOF 无限循环
C: Parsing a file with fgetc() - EOF infinite loop
大家好@Whosebug,
目前我正在尝试为 .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;
}
它很大程度上基于您的原始代码。所有评论都是我的。
大家好@Whosebug,
目前我正在尝试为 .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;
}
它很大程度上基于您的原始代码。所有评论都是我的。