Code bugg , veut savoir la raison
Résolu
glennog
Messages postés
293
Date d'inscription
Statut
Membre
Dernière intervention
-
glennog Messages postés 293 Date d'inscription Statut Membre Dernière intervention -
glennog Messages postés 293 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Code bugg , veut savoir la raison
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
2 réponses
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 :
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;