我的代码用于显示用户选择选项时文件中包含的一些问题。 但是我遇到了这个问题:程序显示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 ”是包含问题的文件
-抱歉英语不好-
答案 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个问题,则确实不需要。