当while循环中包含fgets()时,输出是正确的,但是将其带到外面会使它成为无限循环。谁能解释原因?
main()
{
FILE *fp=fopen("myfile.txt","r");
char s[100];
fgets(s,50,fp);
while(s!=NULL) //infinte loop
puts(s);
/* while((fgets(s,100,fp))!=NULL)
puts(s);
This runs fine */
fclose(fp);
}
[s!=NULL
比较数组s的地址和NULL,它将永远不会匹配。
while(fgets(s,100,fp))!=NULL)
将fgets()
的返回与NULL(在EOF或错误时为NULL)进行比较。
搜索:
手册页fgets
代码1
main()
{
FILE *fp=fopen("myfile.txt","r");
char s[100];
fgets(s,50,fp); /*1*/
while(s != NULL) /*2*/
{
puts(s); /*3*/
}
fclose(fp);
}
代码2
main()
{
FILE *fp=fopen("myfile.txt","r");
char s[100];
while((fgets(s,100,fp)) != NULL) /*1*/
{
puts(s); /*2*/
}
fclose(fp);
}
在代码1]中,>当到达点/*1*/
时,缓冲区s
不为空,并且包含一些字符串(不是null
)。因此,您要用while loop
输入s!=null
,然后在/*3*/
中将其打印在stdoutput中,并返回到点/*2*/
,询问是否s != null
,并再次得到与s
不是相同的答案[ C0]。因此,您将永远陷入这个无限循环中。
在代码2]中,在点null
中,您正在重做输入流中的一行,并询问其是否不是/*1*/
。当达到null
或在读取过程中发生fgets()
时,EOF
返回null。在某些时候,您将到达error
,并且eof
将返回null,然后退出循环。