IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

[Débutant] Problème de fichier


Sujet :

Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 51
    Points : 22
    Points
    22
    Par défaut [Débutant] Problème de fichier

    Voila, depuis un ptit moment, j'ai un ptit problème de Files dans mon programme (console application).

    Prob : dans une procédure, j'enregistre des détails dans trois différents fichiers (examinerfile, centrefile and subjectfile). Jusque là pas de soucis mais une fois que je veux montrer ces détails dans la blackscreen, il n'y a que quelques noms à l'écran. Je ne pige pas très bien pourquoi il ne veut pas montrer tous les détails.

    Si vous pouviez me montrer mon erreur, ou ce que je dois faire ce serait gentil... Merci bien

    Voilà mon code

    1er : la procédure dans laquelle j'enregistre mes détails dans les fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Procedure NewDetails;
    var a: integer;
        Position:longint;
    begin
     if FileExists('C:\Documents and Settings\Braecking\Desktop\PROJECT DELPHI\Test Version\Examiner.dat')then     // change the position if you copy, cut the program !
      begin
       Assign(ExaminerFile, 'Examiner.dat');  // if file exists then take the right position in the file
       Reset (examinerFile) ;
       Position := Filesize(ExaminerFile);    //calcul the all the details registered
       Seek(ExaminerFile, Position);          //take the position after the last details registered (for a new request)
      end
     else
      begin
       AssignFile (ExaminerFile, 'Examiner.dat'); // if the file doesn't exist then create a new file
       Rewrite(ExaminerFile);
      end;
     AssignFile (SubjectFile, 'Subject.dat');
     Rewrite(SubjectFile);
     AssignFile (Centrefile, 'Centre.dat');
     Rewrite(CentreFile);
     Write ('How many examiner details do you want to enter? ');
     Readln (RepeatRequest);
     for a:= 1 to RepeatRequest
      do
      begin
       Writeln ('');
       Writeln ('NEW DETAILS N',a);
       Writeln ('--------------');
       Write (' Enter the examiner name: ');
       Readln (Examiner[a].ExaminerName);
       GetValidExaminerno;
       Write (' Enter the examiner address: ');
       Readln (Examiner[a].ExaminerAddress);
       Write (' Enter the total number of script marked: ');
       Readln (Examiner[a].TotalScripts);
       GetValidSubRefCode;
       Write (' Enter the subject name: ');
       Readln( Subject[a].SubjectName);
       Write (' Enter the payment for marking each script: ');
       Readln (Subject [a].SubPaymentScript);
       GetValidCentreno;
       Write (' Enter the centre name: ');
       Readln (Centre[a].Centrename);
       Write (ExaminerFile, Examiner[a]);
       Write (SubjectFile, Subject[a]);
       Write (CentreFile, Centre[a]);
      end;
     Closefile (ExaminerFile);
     Closefile (SubjectFile);
     Closefile (CentreFile);
     Writeln ('');
     Writeln ('');
     Writeln (' Sub-menu of New Request ');
     Writeln (' ------------------------');;
    end; {of procedure}
    2ème : la procédure dans laquelle je montre tous mes détails dans la blackscreen.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    begin
     AssignFile (examinerFile, 'examiner.dat');
     Reset (examinerFile);
     AssignFile (Centrefile, 'centre.dat');
     Reset (centrefile);
     Ptr := 0;
     Writeln ('-Name-     -Centre Number-    -Centre Name-    -Number of scripts marked-');
     while not eof (examinerfile) and not eof (centrefile)
      do
       begin
       Ptr := Ptr + 1;
       Writeln ('');
       Read (examinerfile, examiner[ptr]);
       Read (centrefile, centre[ptr]);
       Writeln ('');
       Write (examiner[ptr].examinername,'           ',centre[ptr].centreno,'              ');
       Writeln (centre[ptr].centrename,'                  ',examiner[ptr].totalscripts);
      end;
     Readln;
     Closefile (examinerfile);
     Closefile (centrefile);
     Writeln ('');
     Writeln ('');
     Writeln (' Sub-menu of Examiner List ');
     Writeln (' -------------------------');
    end;
    Personne n'a une idée du problème ?

    FX

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hi,

    Il serait utile d'avoir les définitions des types/tableaux que tu utilises.


    En gros, je dirai que tu n'affiches que les quelques noms que tu viens d'entrer, et que ceux qui étaient déjà dans le fichier sont perdus ?

    En effet, dans ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure NewDetails;
    var a: integer;
        Position:longint;
    begin
     if FileExists('C:\Documents and Settings\Braecking\Desktop\PROJECT DELPHI\Test Version\Examiner.dat')then     // change the position if you copy, cut the program !
      begin
       Assign(ExaminerFile, 'Examiner.dat');  // if file exists then take the right position in the file
    Le fichier 'C:\Documents and Settings\Braecking\Desktop\PROJECT DELPHI\Test Version\Examiner.dat' n'est probablement pas le même que 'Examiner.dat' sans autre chemin précisé, car dans ce cas le fichier se trouve dans le répertoire d'exécution de ton programme (mais après tout, le chemin écrit en rouge vise peut-être le répertoire d'exécution de ton programme, auquel cas, il est inutile de préciser tout ce chemin, qui interdit le déplacement du programme + ses fichiers de données).

    D'autre part, pourquoi faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     AssignFile (SubjectFile, 'Subject.dat');
     Rewrite(SubjectFile);
     AssignFile (Centrefile, 'Centre.dat');
     Rewrite(CentreFile);
    Pour ces 2 autres fichiers, ils sont systématiquement écrasés, alors que j'ai l'impression qu'ils ils sont censés être parallèles au 1er ?

    Enfin, plutôt que faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     Write ('How many examiner details do you want to enter? ');
     Readln (RepeatRequest);
     for a:= 1 to RepeatRequest
    ...
    pour entrer des données, il serait plus malin de faire une boucle repeat, en contrôlant les valeurs entrées.

    Par exemple, on pourrait arrêter les entrées quand l'utilisateur a entré une chaine vide pour une des entrées, auquel cas, on sortirait de la boucle.

    Il faut toujours prévoir que l'utilisateur peut être interrompu, et ne pourra pas forcément entrer toutes les données qu'il avait prévu au départ, il faut donc lui laisser une possibilité de terminer rapidement, ce qu'une boucle for ne permet pas, en tout cas, quand c'est écrit comme ton code.

    Gros défaut, l'usage systématique de variables globales, ça ne favorise pas la maintenance, ni la lecture par d'autres que toi, surtout quand tu ne mets que des portions de code.

    J'espère avoir été assez clair, pose des questions si ça ne va pas.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 51
    Points : 22
    Points
    22
    Par défaut
    me revoila,

    merci de ta réponse plus que complète

    Tout les details sont sauvés dans les trois fichiers sans aucuns problemes, et ne sont pas supprimés en cas de nouvelle entrées. On dirait que le programme ignore tout les détails entrés lors de precedentes entrées et montre seulement les détails provenant de la dernière entrée.

    Il y a quelques jours, j'avais demandé un peu d'aide parce que mon programme à chaque nouvelle entrées supprimait les anciens details deja présent dans les fichiers. On m'a dit d'ajouté ce bout de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     if FileExists('C:\Documents and Settings\Braecking\Desktop\PROJECT DELPHI\Test Version\Examiner.dat')then     // change the position if you copy, cut the program !
      begin
       Assign(ExaminerFile, 'Examiner.dat');  // if file exists then take the right position in the file
       Reset (examinerFile) ;
       Position := Filesize(ExaminerFile);    //calcul the all the details registered
       Seek(ExaminerFile, Position);          //take the position after the last details registered (for a new request)
      end
     else
      begin
       AssignFile (ExaminerFile, 'Examiner.dat'); // if the file doesn't exist then create a new file
       Rewrite(ExaminerFile);
      end;
     AssignFile (SubjectFile, 'Subject.dat');
     Rewrite(SubjectFile);
     AssignFile (Centrefile, 'Centre.dat');
     Rewrite(CentreFile);
    mais il marche à moitié: il enregistre correctement les nouveaux details dans les fichiers sans supprimés les anciens mais le programme ne montre pas tout les details presents dans les fichiers dans la blackscreen

    Pour répondre à tes autres petites questions:

    le fichiers 'C:\Documents and Settings\Braecking\Desktop\PROJECT DELPHI\Test Version\Examiner.dat' est bien le même que 'examiner.dat'

    Les trois fichiers sont bien censées être parrallèles.

    Peut être qu'à chaque fois que je lance le programme, la variable 'a' utilisé par mon for loop est remise à 1, et que plusieurs (exemple) examiner[a].examinerno on le même numéro [1] et peuvent faire un petit conflict lorsque j'éssaie de les appelés sur la fenêtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Write ('How many examiner details do you want to enter? ');
     Readln (RepeatRequest);
     for a:= 1 to RepeatRequest
      do
      begin
       Writeln ('');
       Writeln ('NEW DETAILS N',a);
       Writeln ('--------------');
       Write (' Enter the examiner name: ');
       Readln (Examiner[a].ExaminerName);
      GetValidExaminerno(a);
       Write (' Enter the examiner address: ');
       Readln (Examiner[a].ExaminerAddress); etc....;
    FX

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hello,

    Citation Envoyé par braecking
    Le fichiers 'C:\Documents and Settings\Braecking\Desktop\PROJECT DELPHI\Test Version\Examiner.dat' est bien le même que 'examiner.dat'
    Alors supprime le chemin complet, qui ne sert à rien, et qui, comme déjà signalé, interdit de déplacer le programme + ses fichiers dans un autre répertoire.

    Citation Envoyé par braecking
    Peut être qu'à chaque fois que je lance le programme, la variable 'a' utilisé par mon for loop est remise à 1, et que plusieurs (exemple) examiner[a].examinerno on le même numéro [1] et peuvent faire un petit conflict lorsque j'éssaie de les appelés sur la fenêtre
    Bien sûr qu'elle reprend à 1, tu lui dit de le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for a:= 1 to RepeatRequest
    Que penses-tu réellement faire avec cette variable ?

    Elle pointe dans un tableau dont j'ignore la structure, la taille (là, tu ne vérifies jamais si tu ne débordes pas des limites autorisées pour ton tableau, ça va droit dans un mur).

    Si ton tableau contient déjà des données, alors il faut passer un paramètre à ta procédure, lui disant "Ceci est la première position libre dans le tableau" (ou "Ceci est la dernière position utilisée dans le tableau", au choix).

    Citation Envoyé par braecking
    Tout les details sont sauvés dans les trois fichiers sans aucuns problemes, et ne sont pas supprimés en cas de nouvelle entrées
    Je ne pense pas:

    Le code que j'avais déjà signalé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     AssignFile (SubjectFile, 'Subject.dat');
     Rewrite(SubjectFile);
     AssignFile (Centrefile, 'Centre.dat');
     Rewrite(CentreFile);
    implique que les anciennes données de ces fichiers sont perdues chaque fois que tu entres dans la procédure "NewDetails":

    rewrite(...) crée un fichier s'il n'existe pas,et le vide s'il existait déjà.
    Citation Envoyé par braecking
    On dirait que le programme ignore tout les détails entrés lors de precedentes entrées et montre seulement les détails provenant de la dernière entrée.
    Ce qui montre bien que les anciennes sont effacées, comme je le dis.

    ------------

    Au risque de me répéter, l'utilisation intensive de variables globales est une très mauvaise habitude.
    On peut presque toujours se passer de variables globales, qui rendent le code difficile à lire/comprendre, et pire encore, compliquent la maintenance du code.
    Leur utilisation devrait être réservée à de rares cas où on ne peut s'en passer.

    Les procédures/fonctions savent recevoir des paramètres, il faut utiliser cette possibilité.

    Sans plus de détails, pas possible d'aller plus loin.
    Il faut au minimum les déclarations des types, variables globales que tu utilises.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 51
    Points : 22
    Points
    22
    Par défaut
    re,

    voila je vais te mettre le code complet (procedures + records, variables etc...) pour que tu cerne mieux le probleme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    les variables, et records
    // Begin of Records
    Type
    Texaminer = record
     ExaminerName : string [15];
     Examinerno  : string[10];
     ExaminerAddress: string [30];
     TotalScripts: integer;
     PaymentNet : real;
     PaymentBrut : real;
    end ;{of Texaminer}
    
    Tsubject = record
     SubjectName : String [15];
     SubRefCode: string [5];
     SubPaymentScript: real;
     ExaminerNo: integer;
    end;{of Tsubject}
    
    Tcentre = record
     SubRefCode : string [15];
     CentreNo : string[10];
     CentreName : string [15];
     TotCand: integer;
    end; {of Tcentre}
    
    
    //Begin of Variables
    var
    
    // Variables of Choices in the menu
    MenuChoice: char;
    NewRequestChoice: char;
    ExaminerListChoice: char;
    SubjectListChoice: char;
    RepeatRequest : integer;
    
    // Variables of Files
    ExaminerFile: file of Texaminer;
    Examiner: array [1..20] of Texaminer;
    SubjectFile: file of Tsubject;
    Subject: array [1..15] of Tsubject;
    CentreFile: file of Tcentre;
    centre: array [1..20] of Tcentre;
    
    
    la procedure Newdetails
    
    Procedure NewDetails;
    var a: integer;
        Position:longint;
    begin
     if FileExists('Examiner.dat')then     // change the position if you copy, cut the program !
      begin
       Assign(ExaminerFile, 'Examiner.dat');  // if file exists then take the right position in the file
       Reset (examinerFile) ;
       Position := Filesize(ExaminerFile);    //calcul the all the details registered
       Seek(ExaminerFile, Position);          //take the position after the last details registered (for a new request)
       Assign(SubjectFile, 'Subject.dat');
       Reset (SubjectFile) ;
       Assign (CentreFile, 'Centre.dat');
       Reset (CentreFile);
      end
     else
      begin
       AssignFile (ExaminerFile, 'Examiner.dat'); // if the file doesn't exist then create a new file
       Rewrite(ExaminerFile);
       AssignFile (SubjectFile, 'Subject.dat');
       Rewrite(SubjectFile);
       AssignFile (Centrefile, 'Centre.dat');
       Rewrite(CentreFile);
      end;
    
     Write ('How many examiner details do you want to enter? ');
     Readln (RepeatRequest);
     for a:= 1 to RepeatRequest
      do
      begin
       Writeln ('');
       Writeln ('NEW DETAILS N',a);
       Writeln ('--------------');
       Write (' Enter the examiner name: ');
       Readln (Examiner[a].ExaminerName);
      GetValidExaminerno(a);
       Write (' Enter the examiner address: ');
       Readln (Examiner[a].ExaminerAddress);
       Write (' Enter the total number of script marked: ');
       Readln (Examiner[a].TotalScripts);
       GetValidSubRefCode (a);
       Write (' Enter the subject name: ');
       Readln( Subject[a].SubjectName);
       Write (' Enter the payment for marking each script: ');
       Readln (Subject [a].SubPaymentScript);
       GetValidCentreno (a);
       Write (' Enter the centre name: ');
       Readln (Centre[a].Centrename);
       Write (ExaminerFile, Examiner[a]);
       Write (SubjectFile, Subject[a]);
       Write (CentreFile, Centre[a]);
      end;
     Closefile (ExaminerFile);
     Closefile (SubjectFile);
     Closefile (CentreFile);
     Writeln ('');
     Writeln ('');
     Writeln (' Sub-menu of New Request ');
     Writeln (' ------------------------');;
    end; {of procedure}
    
    
    et la procedure ou j'appelle mes données pour la blackscreen.
    
    begin
     AssignFile (examinerFile, 'examiner.dat');
     Reset (examinerFile);
     AssignFile (Centrefile, 'centre.dat');
     Reset (centrefile);
     Ptr := 0;
     Writeln ('-Name-     -Centre Number-    -Centre Name-    -Number of scripts marked-');
     while not eof (examinerfile) and not eof (centrefile)
      do
       begin
       Ptr := Ptr + 1;
       Writeln ('');
       Read (examinerfile, examiner[ptr]);
       Read (centrefile, centre[ptr]);
       Writeln ('');
       Write (examiner[ptr].examinername,'           ',centre[ptr].centreno,'              ');
       Writeln (centre[ptr].centrename,'                  ',examiner[ptr].totalscripts);
      end;
     Readln;
     Closefile (examinerfile);
     Closefile (centrefile);
     Writeln ('');
     Writeln ('');
     Writeln (' Sub-menu of Examiner List ');
     Writeln (' -------------------------');
    end;
    J'ai changé un peu le début de la procedure NewDetails pour qu'il arrete de supprimer et remplacer par des nouveaux fichiers.

    Je sais que lemploie des global variables peut etre un probleme, ma prof mavait dit exactement la même chose mais bon comme je suis débutant j'ai encore un peu de mal à m'y retrouver

    FX

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    HiHi,
    Citation Envoyé par braecking
    voila je vais te mettre le code complet (procedures + records, variables etc...) pour que tu cerne mieux le probleme
    Ok, je vais regarder d'un peu plus près.

    Citation Envoyé par braecking
    J'ai changé un peu le début de la procedure NewDetails pour qu'il arrete de supprimer et remplacer par des nouveaux fichiers.
    Bien, toujours ça de fait

    Citation Envoyé par braecking
    Je sais que lemploie des global variables peut etre un probleme, ma prof mavait dit exactement la même chose mais bon comme je suis débutant j'ai encore un peu de mal à m'y retrouver
    C'est précisément pour ça qu'il faut éviter les variables globales : tout ce qu'une procédure/fonction doit utiliser doit lui être passé en paramètre, ça permet de savoir ce qu'elle utilise.

    Ton argument n'est donc pas une excuse valable .

    Au contraire, c'est une raison supplémentaire pour que tu supprimes tout de suite cette utilisation de variables globales, car un proverbe "spécial programmeur", qui s'applique également à bien d'autres domaines dit:

    "Les mauvaises habitudes se prennent très, et sont très longues à éliminer"
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 51
    Points : 22
    Points
    22
    Par défaut
    lol ok promesse je changerai la procedure et utiliserai des parametres une fois que j'aurais compris ce qui ne va pas dans cette fameuse procedure

    comme ca je changerai mes mauvaise habitudes

    FX

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoï,

    Voilà vite fait le code avec mes pricipales remarques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    //les variables, et records
    // Begin of Records
    Type
    Texaminer = record
     ExaminerName : string [15];
     Examinerno  : string[10];
     ExaminerAddress: string [30];
     TotalScripts: integer;
     PaymentNet : real;
     PaymentBrut : real;
    end ;{of Texaminer}
     
    Tsubject = record
     SubjectName : String [15];
     SubRefCode: string [5];
     SubPaymentScript: real;
     ExaminerNo: integer;
    end;{of Tsubject}
     
    Tcentre = record
     SubRefCode : string [15];
     CentreNo : string[10];
     CentreName : string [15];
     TotCand: integer;
    end; {of Tcentre}
     
     
    //Begin of Variables
    var
     
    // Variables of Choices in the menu
    MenuChoice: char;
    NewRequestChoice: char;
    ExaminerListChoice: char;
    SubjectListChoice: char;
    RepeatRequest : integer;
     
    // Variables of Files
     
    { l'examen du code, du moins la partie que tu m'as fournie,
       montre que tu n'as pas besoin de tableaux,
      et que si tu veux les maintenir, il va falloir systématiquement
      en vérifier les limites.
      Voir particulièrement la procédure qui affiche les données }
     
    ExaminerFile: file of Texaminer;
    Examiner: array [1..20] of Texaminer;
    SubjectFile: file of Tsubject;
     
    { pourquoi moins de place pour "Tsubject" ? }
     
    Subject: array [1..15] of Tsubject;
    CentreFile: file of Tcentre;
    centre: array [1..20] of Tcentre;
     
     
    //la procedure Newdetails
     
    Procedure NewDetails;
    var a: integer;
        Position:longint;
    begin
     if FileExists('Examiner.dat')then     // change the position if you copy, cut the program !
      begin
       Assign(ExaminerFile, 'Examiner.dat');  // if file exists then take the right position in the file
       Reset (examinerFile) ;
     
       Position := Filesize(ExaminerFile);    //calcul the all the details registered
       Seek(ExaminerFile, Position);          //take the position after the last details registered (for a new request)
     
       { les 2 lignes précédentes
       
          Position := Filesize(ExaminerFile);    //calcul the all the details registered
          Seek(ExaminerFile, Position);          //take the position after the last details registered (for a new request)
     
         "calent" l'accès au fichier  "ExaminerFile"
         à la fin, ce qui fait que les prochains "write" se feront
         à la suite de ce qui existe déjà, ce qui est bien ce que tu veux
         
         Il faut donc faire la même chose avec les 2 autres fichiers,
         "reset" se contentant d'ouvrir un fichier, en se calant au
         début : les nouveaux "write" écrasent le contenu existant.
         L'erreur se situe essentiellement ici, voir plus loin }
     
       Assign(SubjectFile, 'Subject.dat');
       Reset (SubjectFile) ;
       Assign (CentreFile, 'Centre.dat');
       Reset (CentreFile);
      end
     else
      begin
       AssignFile (ExaminerFile, 'Examiner.dat'); // if the file doesn't exist then create a new file
       Rewrite(ExaminerFile);
       AssignFile (SubjectFile, 'Subject.dat');
       Rewrite(SubjectFile);
       AssignFile (Centrefile, 'Centre.dat');
       Rewrite(CentreFile);
      end;
     
     Write ('How many examiner details do you want to enter? ');
     Readln (RepeatRequest);
     
     { comme déjà dit, une boucle "for" n'es pas du tout l'idéal
       pour gérer des entrées comme tu le fais }
     
     { au lieu de mettre tes données dans un tableau, ce qui limite forcément
       la quantité que tu peux entrer, tu peux te contenter d'utiliser de simples
       variables de type du type correct.
       Plus de tableau, plus d'indice à gérer, qui en plus ne sert à rien,
       puisque tu stockes immédiatement les données }
     
     for a:= 1 to RepeatRequest
      do
      begin
       Writeln ('');
       Writeln ('NEW DETAILS N',a);
       Writeln ('--------------');
       Write (' Enter the examiner name: ');
       Readln (Examiner[a].ExaminerName);
       GetValidExaminerno(a);
       Write (' Enter the examiner address: ');
       Readln (Examiner[a].ExaminerAddress);
       Write (' Enter the total number of script marked: ');
       Readln (Examiner[a].TotalScripts);
       GetValidSubRefCode (a);
       Write (' Enter the subject name: ');
       Readln( Subject[a].SubjectName);
       Write (' Enter the payment for marking each script: ');
       Readln (Subject [a].SubPaymentScript);
       GetValidCentreno (a);
       Write (' Enter the centre name: ');
       Readln (Centre[a].Centrename);
       Write (ExaminerFile, Examiner[a]);
       Write (SubjectFile, Subject[a]);
       Write (CentreFile, Centre[a]);
      end;
     Closefile (ExaminerFile);
     Closefile (SubjectFile);
     Closefile (CentreFile);
     Writeln ('');
     Writeln ('');
     Writeln (' Sub-menu of New Request ');
     Writeln (' ------------------------');;
    end; {of procedure}
     
     
    //et la procedure ou j'appelle mes données pour la blackscreen.
     
    begin
     AssignFile (examinerFile, 'examiner.dat');
     Reset (examinerFile);
     AssignFile (Centrefile, 'centre.dat');
     Reset (centrefile);
     Ptr := 0;
     Writeln ('-Name-     -Centre Number-    -Centre Name-    -Number of scripts marked-');
     
     { ici, l'utilisation de tableaux est également inutile,
       et de plus te conduit droit dans un mur, vu que tu ne contrôles
       jamais les limites (Ptr par rapport à la taille déclarée des tableaux).
       
       En effet, que va-t-il se passer s'il y a plus de données dans le fichier
       que le tableau peut contenir ?
       
       Comme pour l'entrée des données, de simples variables du type correct
       suffisent.
       
       L'erreur qui fait que pour chaque nouvelle série de données
       tu écrases les données des fichiers autre que
       entre en jeux ici : le test contrôlant la boucle "while"
       fait que ça s'arrête quand la fin le fichier le plus court
       (en nombre de données) est atteinte }
     
     while not eof (examinerfile) and not eof (centrefile)
      do
       begin
       Ptr := Ptr + 1;
       Writeln ('');
       Read (examinerfile, examiner[ptr]);
       Read (centrefile, centre[ptr]);
       Writeln ('');
       Write (examiner[ptr].examinername,'           ',centre[ptr].centreno,'              ');
       Writeln (centre[ptr].centrename,'                  ',examiner[ptr].totalscripts);
      end;
     Readln;
     Closefile (examinerfile);
     Closefile (centrefile);
     Writeln ('');
     Writeln ('');
     Writeln (' Sub-menu of Examiner List ');
     Writeln (' -------------------------');
    end;
    En gros ça devrait aller si tu corriges ce que j'ai signalé comme produisant le problème, et ce qui va t'en poser, les tableaux, parfaitement inutiles dans ton code, et même nuisibles, puisqu'ils limitent la quantité de données que tu peux gérer, plus particulièrement avec ta manière de les déclarer : taille fixe.

    Et bien entendu, ne plus travailler avec des variables globales

    Bon courage, ça fait un peu de travail, mais pas tellement tout de même.

    Au fait, "blackscreen" c'est l'écran : moins snob , et plus court à écrire.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 51
    Points : 22
    Points
    22
    Par défaut
    ok je vais analyser tout tes ptits conseils tantot...

    ps : pour la "blackscreen", comme je fais tout en anglais, kkfois j'utilise des termes anglais (peut etre fainéantise de traduire ) lol

    en tout cas pour ton aide

    FX

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2007
    Messages : 51
    Points : 22
    Points
    22
    Par défaut
    Excellent ca marche nickel

    bon minant vais moccuper de ces parametres pour cette fonction

    encore pour ton aide

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hy,

    Penses aussi à virer les tableaux, puiqu'ils ne servent à rien.

    Et à éviter de contrôler le nombre d'entrées par une boucle for

    Vite fait, tu peux faire quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ...
     
    { s est la 1ère des chaines que tu vas lire, à toi d'ajuster le nom }
     
    repeat
      writeln ('entrez gnagnagna... , ENTER pour arrêter les entrées : ';
      readln (s);
     
      if ( length(s) <> 0) then
      begin
         { la suite du code des entrées }
      end;
    until length(s) = 0;
     
    ...
    Bien du plaisir
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/05/2007, 11h11
  2. Problème de fichier jar avec eclipse<débutant>
    Par melodie53 dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 28/07/2006, 15h41
  3. [Débutant] Problème avec le contenu d'un fichier
    Par kennie77 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 15/10/2005, 21h48
  4. Réponses: 3
    Dernier message: 18/08/2005, 11h57
  5. Réponses: 2
    Dernier message: 28/04/2004, 11h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo