Остановка в конце файла
У меня проблема с получением моего цикла, чтобы остановить чтение файла после окончания. Как я могу заставить его остановиться после последней строки и перейти к следующей строке кода? Также я хотел бы, чтобы увеличенный счет останавливался в цикле, а окончательный результат записывался в файл, кто-нибудь может помочь? Спасибо
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;
1 ответ
Есть несколько проблем с вашим кодом:
Не использовать
fflush(stdin);
, Поведение не определено. Может читать ожидающие символы изstdin
в вашей системе, но это не портативный способ сделать это. Действительно, нет портативного способа сделать это. Это, вероятно, тоже не нужно.Вы не проверяете возвращаемое значение
scanf
,scanf
возвращает количество полей, правильно прочитанных изstdin
, Если поле не читается правильно, значение в выходной переменной является неопределенным, поэтому вам следует либо повторить попытку, либо прервать ее.scanf("%s", f_name);
опасно: неожиданно длинный ввод приведет к переполнению буфера, и ваша программа может аварийно завершить работу или иметь потенциально опасное поведение. Этот вид ошибки может использоваться хакерами для проникновения в систему. использованиеscanf("%39s", f_name);
еслиf_name
это массив из 40 символов.Код, который вы разместили, не показывает определения
f_name
,stud
... и многие другие переменные или структуры. Мы не можем проверить, правильно ли вы используете. Например, конкатенация выполняетсяstrcat(f_name,"101stud.txt");
может вызвать неопределенное поведение, еслиf_name
недостаточно великbreak;
оператор в середине кода только отрывается от внутреннегоwhile
петля, а не внешняяdo / while
петля.i++;
следующее утверждение никогда не достигается.Финал
scanf("%d",&ch);
может произойти сбой, если во входном потоке присутствует нецифровый символ. В этом случае,ch
имеет неопределенное содержание. Поэтому тест наch == 1
не надежно