我有一个问题让我的循环在结束后停止读取文件。如何让它在最后一行之后停止并转到下一行代码?此外,我希望增加的分数停止循环,最终结果写入文件,任何人都可以帮助吗?谢谢
do {
system("cls");
i = 0;
printf("\tPortal Examination\n\tEnter Faculty name.:");
fflush(stdin);
scanf("%s", f_name);
printf("\n\tEnter Course.:");
fflush(stdin);
scanf("%s", course_text);
printf("\n\tEnter ID.:");
fflush(stdin);
scanf("%s", r_query);
k = strlen(r_query);
strcat(f_name,"101stud.txt");
strcat(course_text,"101exam.txt");
f_course = fopen(f_name, "rb");
system("cls");
printf("\tPortal Examination");
printf("\n\n..:: Searching for '%s' \n===================================================\n",r_query);
while (fread(&stud, sizeof(stud), 1, f_course) == 1) {
for (j = 0; j <= k; j++) {
s_rollno[j] = stud.stud_rollno[j];
}
s_rollno[j]='\0';
if (stricmp(s_rollno,r_query) == 0) {
system("pause");
//*****write exams****
f_exam = fopen(course_text, "rb");
while (fread(&numbers, sizeof(numbers), 1, f_exam) != EOF) {
system("cls");
printf("\n\tAnswer all Questions:\n\t%s\n\t",numbers.question);
fflush(stdin);
scanf("%s", a_query);
if (stricmp(numbers.answer, a_query) == 0)
s_result += 5;
printf("%s has %d score\n\t", r_query, s_result);
system("pause");
}
break;
i++;
if (i % 4 == 0) {
printf("..::Press any key to continue...");
getch();
}
}
}
if (i == 0)
printf("\n..::No match found!");
else
printf("\n..:: %d match(s) found.",i);
fclose(f_course);
printf("\n..:: Search Again?\n\n\t[1] Yes\t\t[0] No\n\t");
scanf("%d",&ch);
} while (ch == 1);
break;
答案 0 :(得分:1)
您的代码存在多个问题:
请勿使用fflush(stdin);
。行为未定义。它可能会从您系统上的stdin
读取待处理字符,但这不是可移植的方式。事实上,没有便携的方法可以做到这一点。它可能也没有必要。
您不测试scanf
的返回值。 scanf
返回从stdin
正确读取的字段数。如果字段未正确读取,则输出变量中的值是不确定的,因此您应该重试或中止。
scanf("%s", f_name);
存在风险:意外长输入会导致缓冲区溢出,程序可能会崩溃或有可能造成危害。黑客可以使用这种bug来渗透系统。如果scanf("%39s", f_name);
是一个包含40个字符的数组,请使用f_name
。
您发布的代码未显示f_name
,stud
...以及更多变量或结构的定义。我们无法验证您的使用是否正确。例如,如果strcat(f_name,"101stud.txt");
不够大,f_name
执行的连接可能会导致未定义的行为。
代码中间的break;
语句仅从内部while
循环中断,而不是外部do / while
循环。永远不会达到以下i++;
语句。
如果输入流中存在非数字字符,则最终scanf("%d",&ch);
可能会失败。在这种情况下,ch
具有不确定的内容。因此,对ch == 1
的测试不可靠。