文件读取程序在while循环结束时挂起(linux c)

时间:2016-03-20 22:14:07

标签: c linux io

抱歉这个微不足道的问题。我正逐字逐句地阅读文件。它似乎一直工作到最终运行(EOF),由于某种原因程序挂起。

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

2 个答案:

答案 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条件,第二个是从输入流接收实际上charEOF在您输入时被转换为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};

并没有挂起。