![](/img/trans.png)
[英]C fgetc() on socket/file stream while checking for EOF goes into infinite loop
[英]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.