while循环的最后一行" Done外循环,in为0"印刷,但 由于某种原因,即使条件为"(在!=' 0')",循环也不会退出。线"完成解析事件"没有打印,程序停止并且没有响应。
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);
答案 0 :(得分:3)
尝试改变:
char in = '1';
要:
int in = '1';
首先,fgetc
函数的返回类型为int
。当您到达文件末尾时EOF
被返回(可能是-1
,我认为它等于-1
)。然后-1
存储在in
变量中,其类型为char
。标准中未定义char
已签名或未签名,在您的情况下,它似乎是未签名的,因此in
变为255
。然后,in
被提升为int
类型,以便与EOF
进行比较,但255 != -1
当然,因此您处于无限循环中。
答案 1 :(得分:0)
即使您发布的代码以及您收到的有关使用fgetc(3)
的答案,您发布的代码也不应该挂起。让我们看看会发生什么:
fgetc(3)
返回int
-1
值(作为int
,因为通常如此定义常量EOF
)以区分8的可能性为8对于char
条件(不是来自流的数据值),位EOF
加上一个,并且转换为char
(简单地制作EOF
一些有效输入的别名)。在您的情况下,您已将该条件同化为char
类型的某个值,但错误。
但这通常不会使程序挂起(它甚至不定义未定义的行为,除了我们实际上不知道哪个char
值将是用作EOF
条件的别名。然后,程序将有{strong>两个条件break
循环(因为你已经屏蔽了一个)。第一个是真正的EOF
条件,第二个是从输入流接收实际上char
,EOF
在您输入时被转换为printf(3)
。
正如有人在评论中指出的那样。 问题必须在大的评论栏中,你已经隐藏了。即使你执行char in = '1';
之后执行,而且块的外部也没有,你可以在隐藏块中出现错误,只有在离开时才会出现错误,并使错误显而易见。你在代码块的开头做的循环测试。
将int in = '1';
更改为break
是消除问题#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
$ _
命令用于添加在此处嵌入输出所需的四个空格
输出文本,您不得在家中使用它进行测试):
data testData = {1,1,foo};
并没有挂起。