2015-12-12 1 views
-1

J'ai un problème pour que ma boucle arrête de lire le fichier après la fin. Comment puis-je l'arrêter après la dernière ligne et passer à la ligne de code suivante? Je voudrais aussi que le score incrémenté s'arrête avec la boucle et que le résultat final soit écrit dans un fichier. Quelqu'un peut-il m'aider? MerciArrêt à la fin du fichier

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; 

Répondre

1

Il y a plusieurs problèmes avec votre code:

  • Ne pas utiliser la fflush(stdin);. Le comportement est indéfini. Il peut lire les caractères en attente de stdin sur votre système, mais ce n'est pas la manière portable de le faire. En effet, il n'y a pas de moyen portable de le faire. Ce n'est probablement pas nécessaire non plus.

  • Vous ne testez pas la valeur de retour de scanf. scanf renvoie le nombre de champs correctement lus à partir de stdin. Si le champ n'est pas lu correctement, la valeur de la variable de sortie est indéterminée. Vous devez donc réessayer ou abandonner.

  • scanf("%s", f_name); est risqué: une entrée trop longue provoque un débordement de la mémoire tampon et votre programme peut tomber en panne ou avoir un comportement potentiellement dangereux. Ce type de bug peut être utilisé par les pirates pour pénétrer un système. Utilisez scanf("%39s", f_name); si f_name est un tableau de 40 caractères.

  • Le code que vous avez affiché ne montre pas les définitions de f_name, stud ... et beaucoup d'autres variables ou structures. Nous ne pouvons pas vérifier si votre utilisation est correcte. Par exemple, la concaténation effectuée par strcat(f_name,"101stud.txt"); peut provoquer un comportement indéfini si f_name n'est pas assez grand.

  • la déclaration break; au milieu du code de la casse ne boucle while intérieure, et non la boucle do/while extérieure. L'instruction i++; qui suit n'est jamais atteinte.

  • Le résultat final scanf("%d",&ch); peut échouer si un caractère non numérique est présent dans le flux d'entrée. Dans ce cas, ch a un contenu indéterminé. Par conséquent, le test sur ch == 1 n'est pas fiable.