更改fgets()函数位置的不同输出

问题描述 投票:1回答:2

当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);
}
c loops file-handling
2个回答
2
投票

[s!=NULL比较数组s的地址和NULL,它将永远不会匹配。

while(fgets(s,100,fp))!=NULL)fgets()的返回与NULL(在EOF或错误时为NULL)进行比较。

搜索:

手册页fgets

2
投票

代码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,然后退出循环。

© www.soinside.com 2019 - 2024. All rights reserved.