Code bugg , veut savoir la raison

Résolu/Fermé
glennog Messages postés 293 Date d'inscription jeudi 3 janvier 2013 Statut Membre Dernière intervention 19 novembre 2013 - 10 févr. 2013 à 02:55
glennog Messages postés 293 Date d'inscription jeudi 3 janvier 2013 Statut Membre Dernière intervention 19 novembre 2013 - 12 févr. 2013 à 20:32
Bonjour,

je suis en train de faire un exercice sur les fichiers et les enregistrements , alors , j'ai fait , une procédure qui me permet d'ajouter les informations d"un etudiant ( structure ) dans un fichier , et je voudrais ajouter ensuite , un autre enregistrement à la suite , mais quand je le fais , mon programme ne marche correctement que lorsqu'il est exécuté , une fois , quand j'essaie de le refaire ( avec une boucle , ) mon programme , bug ( la ligne de commande est vide ( du au clrscr) , mais , ensuite , je ne peux plus entrer d'élements , tout ce que je mets , n'est pas pris en ccompte , ( ne sort pas dans le ligne de commande , voici ce que j'ai fait , pourriez vous me dire ou se situe l'erreur ( qu'est ce qui entraine cela ) , je sais que c'est au niveau du repassage dans la boucle , mais je ne sais pas ou exactement

procedure ajouter;      (* permet d'ajouter un etudiant dans le fichier etudiant *)
begin
     clrscr;
     rep:='o';
     while(rep='o')or(rep='O')do
     begin
          assign(fichier,'etudiant.dat'); (* on assigne le nom etudiant.dat au fichier etudiant *)

          {$i-}
         reset(fichier);  (* permet d'ouvrir le fichier et de le preparer en lecture *)
          if IOResult <> 0 then

               rewrite(fichier);  (* ouverture du fichier en ecriture *)
          while not eof(fichier)do  (* lorsque nous se sommes pas encore arrivés à la fin du fichier , alors *)
          read(fichier,etude);      (* on lit le fichier , après chaque opération , le pointeur est avancé a la position de l'element suivant *)

          {$i+}
          if IOResult >0 then

               rewrite(fichier) ;   (* a chaque fois que je vois rewrite , cela me permet d'ouvrir le fichier en ecriture *)
          while not eof(fichier)do
          read(fichier,etude);
          begin
               clrscr;
              


               writeln('                         *******     PROGRAMME   *******    ');
               writeln('                         *******  ENREGISTREMENT *******    ');
               writeln('                         *******     ETUDIANT    *******    ');
               writeln;
               writeln;

               write('Matricule: ');
               readln(etude.matricule);
               write('Nom: ');
               readln(etude.nom);
               write('Prenoms: ');
               readln(etude.prenom);
               writeln('Classe: ');
               readln(etude.classe);
               writeln('Sexe: M/F:  ');
               readln(etude.sexe);

               write(fichier,etude);

               write('VOULEZ-VOUS EFFECTUER UN AUTRE ENREGISTREMENT ETUDIANT?:  O/N:  ');
               readln (rep);
               clrscr;
          end;
     end;
end;





A voir également:

2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 févr. 2013 à 04:24
Déjà tu utilises des variables globales (fichier, etude, rep) et ça c'est mal !
Il est toujours bien mieux d'utiliser des paramètres, et a fortiori utiliser des variables locales, plutôt que des variables globales qui servent à tout et n'importe quoi.

Ensuite, tu mélanges tout (encore), en faisant à la fois du traitement de fichier, de l'interactivité avec l'utilisateur, et tout ça dans la même procédure.
Il faut scinder ton code afin d'avoir des procédures qui font une seule chose à la fois, et qui le font bien (gestion des erreurs en particulier). Cela permet de faire des codes plus simples à écrire, plus simple à lire et plus simple à déboguer !

Enfin, et c'est l'un de tes plus gros problème, tu utilise un reset, puis un rewrite, ce qui efface tout, puis tu fais un while not eof, avec des read bidon qui sont juste là pour faire avancer la tête de lecture sur un fichier que tu viens de toute façon d'écraser et qui est donc vide --'
Tu devrais plutôt utiliser un append si ton fichier est un Text ou alors un reset suivi d'un seek si c'est un fichier binaire (ce qui est surement le cas ici)

Ensuite les {$I-}, {$I+} et IOResult, il faut les utiliser correctement ou alors ne pas les utiliser du tout, mais s'en servir mal est encore pire !

PS. J'ai corriger le code de tête, il faudrait tester en remplaçant TypeDuFichier et TypeDeEtude par leurs valeurs respectives, et corriger les fautes qui traînent :

procedure ajouter(var etude:TypeDeEtude);
var fichier:TypeDuFichier; 
begin
     assign(fichier,'etudiant.dat');
     reset(fichier);
     seek(fichier,fileSize(fichier));
     write(fichier,etude);
     close(fichier);
end;

function saisieEtude():TypeDeEtude;
begin
    write('Matricule: ');
    readln(result.matricule);
    
    write('Nom: ');
    readln(result.nom);

    write('Prenoms: ');
    readln(result.prenom);
     
    write('Classe: ');
    readln(result.classe);

    write('Sexe: M/F:  ');
    read(result.sexe);
end;

procedure interfaceAjout();
var rep:char;
begin
    clrscr;    
    writeln('                         *******     PROGRAMME   *******');
    writeln('                         *******  ENREGISTREMENT *******');
    writeln('                         *******     ETUDIANT    *******');
    writeln;
    
    do
        ajouter(saisieEtude());
        write('VOULEZ-VOUS EFFECTUER UN AUTRE ENREGISTREMENT ETUDIANT ? O/N : ');
        readln(rep);
    while (rep='o') or (rep='O');
end;
0
glennog Messages postés 293 Date d'inscription jeudi 3 janvier 2013 Statut Membre Dernière intervention 19 novembre 2013 4
12 févr. 2013 à 20:32
merci beaucoup pour tes critiques , elles me permettent de mieux comprendre mes erreurs et de les corriger .
merci à toi
0