循环仅打印文件的最后一行(2个循环后)

时间:2019-11-15 17:32:16

标签: c

我的代码用于显示用户选择选项时文件中包含的一些问题。 但是我遇到了这个问题:程序显示2个问题后,它始终只显示文件的最后一行。 我不知道怎么了。

这里是代码(仅在切换菜单的情况1中)

            printf("\nThe selected subject was Geology");

                while(continue != 0)
                {
                    r=0;
                    srand(time(NULL));
                    r = rand()%7;
                    printf("\n%d", r);
                    if(r==0)
                        r=1;

                    for(i=0; i<r; i++)
                        fscanf(arqgeo, "%s %s %s %s %s %c", question, alta, altb, altc, altd, &respa);

                    printf("\n\n%s \n%s \n%s \n%s \n%s \n", question, alta, altb, altc, altd);
                    printf("Enter alternative: ");
                    setbuf(stdin,NULL);
                    scanf("%c",&resp);

                    if(arqgeo == NULL)
                    {
                        printf("An error has occurred\n");
                        printf("Contact the developers !!!\n");
                    } else {
                        if(resp == respa)
                        {
                            printf("You're right!!!\n");
                            pont++;
                            printf("\n\n\n");
                    } else {
                        puts("\a");
                        printf("You missed!!!");
                        printf(" The correct answer is: %c", respa);
                        erro++;
                        printf("\n\n\n");
                    }
                    }
                    printf("Do you wish to continue? Enter a number other than 0  ");
                    scanf("%d", &continue);
                    }
                    break;

其中:“ respa ”是正确的答案,“ alta-d ”是替代品,“ resp ”是用户“ arqgeo ”是包含问题的文件

-抱歉英语不好-

1 个答案:

答案 0 :(得分:0)

添加到Jonathan Leffler和我之前的评论中。

每次迭代都会从文件中读取一些行。第一个迭代工作正常,但是第二个迭代在第一个迭代的左边进行,因此您可以快速浏览很多行。

所需的是在每次迭代的开始将文件倒带到开头。 fseek()函数将为您完成此操作。麻烦的是,如果rand() % 7再次返回相同的数字,您还将重复问题。需要一个初始化为全零的静态数组,以检查是否已使用问题。或使用位图。 rewind()是fseek()的特例,它返回到文件的开头(请考虑使用老式磁带)。

此外,if(arqgeo == NULL)是错误的,因为apqgeo的值不会因麻烦而改变。查看ferror()和feof()函数以测试eof / error条件。 scanf()还会返回用EOF转换的字段的计数,指示某些故障类型,这些“ f”功能将很有用。无论如何,返回值<= 0表示退出的时间(EOF通常为(-1))。

尽管烦恼的是必须对每个输入语句进行测试以查找问题,但这是一种好习惯。如果您不这样做,则需要对因无提示错误导致的行为保持高度警惕。

挑战:安排问题文件,它正在摆脱r == 0测试。如果您有8个问题,则确实不需要。

相关问题