2015-12-12 3 views
-1

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

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 цикла. Указанное ниже утверждение не достигается.

  • Окончательный scanf("%d",&ch); может выйти из строя, если во входном потоке присутствует символ без цифры. В этом случае ch имеет неопределенное содержимое. Поэтому тест на ch == 1 не является надежным.