Остановка в конце файла

У меня проблема с получением моего цикла, чтобы остановить чтение файла после окончания. Как я могу заставить его остановиться после последней строки и перейти к следующей строке кода? Также я хотел бы, чтобы увеличенный счет останавливался в цикле, а окончательный результат записывался в файл, кто-нибудь может помочь? Спасибо

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 не надежно

Другие вопросы по тегам