即使有您发布的代码,以及您收到的关于使用fgetc(3) 的答案,您发布的代码也不应该挂起。让我们看看会发生什么:
fgetc(3) 返回int -1 值(作为int,通常定义为常量EOF)以区分8 位char 的256 种可能性,再加上一种, EOF 条件(不是来自流的数据值)并将其转换为 char(使 EOF 只是一些有效输入的别名)。在您的情况下,您错误地将该条件同化为 char 类型的值之一。
但这通常不会使程序挂起(它甚至没有定义未定义的行为,除了我们实际上不知道哪个char 值将用作@987654333 的别名@ 健康)状况)。然后程序将有 breaking 循环的两个条件(因为您已经屏蔽了一个)。第一个是真正的EOF 条件,第二个是从输入流接收char,当您输入它时EOF 正在被转换为。
正如有人在 cmets 中指出的那样。 问题一定出在大的注释块中,你已经隐藏了。即使 printf(3) 你在它之后执行,而块的外部没有,你可以在隐藏块中出现错误,只有在离开它时才会出现,并使错误明显在循环测试你make 在代码块的开头。
将char in = '1'; 更改为int in = '1'; 是消除虚假breaks 问题的好选择,但您的挂起问题不存在...您必须发布隐藏块以获得更多反馈。
重要提示
尝试习惯于编写完整的失败示例......不要编辑代码只是为了发布它,而不测试它是否继续失败(因为你的没有,我在下面演示),你不会得到这种答案(这似乎更像是一种火焰而不是试图帮助你)。您发布的代码,至少必须进行编辑以使其可运行,因为您仅粘贴了一段无法编译的代码。一些这样的例子,应该像我在下面发布的那样,但是,因为它不会失败,所以不能用来解决你的问题。对吧?
#include <stdio.h> /* line added to make runnable */
#define filename "test.txt" /* line added to make runnable */
int main() /* line added to make runnable */
{ /* line added to make runnable */
char in = '1';
FILE *fid = fopen(filename, "r");
while (in != '0') {
printf("Start of loop, in is %c\r\n", in);
if ((in = fgetc(fid)) == EOF)
in = '0';
/* Large block that does stuff depending on the value of in*/
printf("Done outer loop, in is %c\r\n", in);
}
fclose(fid);
printf("Finished parsing events");
//fflush(stdout);
} /* line added to make runnable */
如下图运行(没有任何挂起)(请注意sed(1)命令用于在此处添加嵌入输出所需的四个空格为
输出文本,请勿在家里使用它进行测试):
$ pru8 | sed -e 's/^/ /'
Start of loop, in is 1
Done outer loop, in is p
Start of loop, in is p
Done outer loop, in is s
Start of loop, in is s
Done outer loop, in is d
[...] <--- a lot more of repeating lines like the ones posted above.
Start of loop, in is
Done outer loop, in is
Start of loop, in is
Done outer loop, in is 0
Finished parsing events
$ _
没有挂起。