使用while(!feof)和终止条件,它仍然在C中无限循环

using while(!feof) with terminating condition ,still it is going in infinite loop in c

提问人:vc59 提问时间:11/20/2016 最后编辑:vc59 更新时间:11/20/2016 访问量:314

问:

我正在为图书馆管理系统编写一个程序作为我的 c 项目。我使用while循环和条件来检查文件。既然我读到我们不应该使用它,如果我们必须的话,我们应该用一些中断语句来做,而且因为我正在阅读大号。文件中的变量,我用来打破 while 循环。每当 and 将匹配 (using ) 设置为 1 时,while 循环将被终止。这是我在这段代码后面使用的逻辑。这是一个结构,其中的一部分。我正在使用linux操作系统进行此程序。请告诉我我弄错了哪里?!feofbookfoundTargetbook.bnamestrcmpfoundbookbook.bname

void Searchbook()
{
    int i;
    char Target[25],stats[3];
    int Found=0;
    if((librecord=fopen("librecord.txt","r"))==NULL)
        printf(" ! The File is Empty...\n\n");
    else
    {
        printf("\nEnter The Name Of Book : ");
        scanf("%s",Target);
        while(!feof(librecord)&& Found==0)
        {
              fscanf(librecord,"%d %s %s %d %d",&book.bid,book.bname,book.author,&book.status,&book.nooftitles);
              if(strcmp(Target,book.bname)==0)
                  Found=1;
              for(i=0;i<book.nooftitles;i++)
                  fscanf(librecord,"%s",book.titles); 
        }
        if(Found)
        { 
             if(book.status==IN)
                strcpy(stats,"IN");
             else
                strcpy(stats,"OUT");
             printf("\nThe Unique ID of The Book:  %d\nThe Name of Book is: %s\nThe Author is:  %s\nThe Book Status:%s\n\n",book.bid,book.bname,book.author,stats);
        }
        else if(!Found)
            printf("! There is no such Entry...\n");
        fclose(librecord);
    }
}

这是我输入书名后面对无限循环的功能。它进入一个无限循环,打印它遇到的第一本书的名字。我该怎么办?我的问题与其他类似问题不同,因为我使用两个条件而不是仅使用两个条件。我正在使用 a 作为 .still 没有终止。 !feof variableflag while loop

C Linux 文件 同时循环 feof

评论

8赞 wildplasser 11/20/2016
1)总是错的 stackoverflow.com/q/5431941/905902 2)是小的“OUT”。feof()stats[3];
0赞 chux - Reinstate Monica 11/20/2016
代码如何知道 in 在 之后是有效的。该输入操作是成功还是失败?book,bnameif(strcmp(Target,book.bname)==0)scanf(librecord,"%d %s %s %d %d",&book.bid,book.bname ...
2赞 Jonathan Leffler 11/20/2016
一个步骤是显示一些正在读取的数据。另一个重要步骤是测试输入函数的返回值。例如,如果输入中的下一个字符不是数字,则 将返回 0,但不会影响 EOF 状态(它尚未达到 EOF;它根本无法将下一个字符作为数字处理)。始终检查输入操作:。fscanf(librecord, "%d %s %s %d %d", &book.bid, book.bname, book.author, &book.status, &book.nooftitles);fscanf()if (fscanf(librecord, "%d %s %s %d %d", …) != 5) { …oops!… }

答:

0赞 amine.ahd 11/20/2016 #1

您没有从文件中读取下一行,因为您根本没有前进。 您需要用于从文件中读取字符串或读取字符。 当它读取新行字符时自动停止,因此这可能是一次读取一行的解决方案。 如果您使用的是 C 库的 GNU 版本,另一种解决方案是使用 [getLine] (http://man7.org/linux/man-pages/man3/getdelim.3.html) 它为您读取一行。fgetsfgetcfgets

无论你使用什么,你都需要阅读一行,然后移动到下一行,直到到达末尾,这不是你用当前代码做的事情。