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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    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.

  3. #3
    Membre averti
    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
    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 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    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.

  5. #5
    Membre averti
    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
    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 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    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"

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