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 :

Sauvegarder les données d'un programme


Sujet :

Pascal

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Sauvegarder les données d'un programme
    Bonjour, je rencontre actuellement des difficultés pour écrire des données d'un tableau dans un fichier. Le programme compile bien, le fichier est bien créé, mais lors de son ouverture, il est vide.
    Voilà mon code Pascal :
    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
    program Renseignements;
    const MAX=100;
    type classeChambre=array[1..MAX] of integer;
             fichier = file of integer;
     
    var Tab : classeChambre;
            classesChambre : fichier;
     
    procedure descriptionHotel( var Tab : classeChambre);
    Var i, n, x, y : integer;
     
     
    begin
                    writeln('Quel est le nombre de chambres de l hotel ?  ');
                    Readln(n);
     
                    writeln('Combien y a t-il de types de chambres ?   ');
                    Readln(x);
     
                    writeln('Quel est le nombre de services que propose l hotel ?   ');
                    Readln(y);
     
                    for i:=1 to n do
                    begin
     
                    writeln('Veuillez préciser la classe de la chambre n°',i);
                    readln(Tab[i]);
                    assign(classesChambre, 'classroom.ods');
                    rewrite(classesChambre);
                    write(classesChambre, Tab[i]);
                    close(classesChambre);
     
                    end;
    end;
     
    begin
     
    descriptionHotel( Tab );
     
    end.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Hoa,

    Piège classique de rewrite :

    - Si le fichier n'existe pas, il est créé

    - S'il existe, il est ouvert et vidé !!

    Je n'ai rien regardé d'autre, déjà corriger ça.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 463
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 463
    Points : 4 305
    Points
    4 305
    Par défaut
    A chaque tour de boucle, tu désignes le fichier (Assign), tu l'ouvres en écriture en le vidant (rewrite), tu écris 1 record et tu le fermes. Il faut mettre le assign, rewrite et close en dehors de la boucle d'écriture
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci à vous, mais en les plaçant avant, sauf le close que j'ai mis entre les deux "end", la compilation est réussie mais après avoir compléter, on me signale "runtime error 103..."
    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
     
    procedure descriptionHotel( var Tab : classeChambre);
    Var i, n, x, y : integer;
     
     
    begin
                    writeln('Quel est le nombre de chambres de l hotel ?  ');
                    Readln(n);
     
                    writeln('Combien y a t-il de types de chambres ?   ');
                    Readln(x);
     
                    writeln('Quel est le nombre de services que propose l hotel ?   ');
                    Readln(y);
                    assign(classesChambre, 'classroom.ods');
                    rewrite(classesChambre);
     
                    for i:=1 to n do
                    begin
     
                    writeln('Veuillez préciser la classe de la chambre n°',i);
                    readln(Tab[i]);
                    write(classesChambre, Tab[i]);
     
                    end;
                    close(classesChambre);
    end;
     
    begin
     
    descriptionHotel( Tab );
     
    end.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Voyez vous? j'ai aussi un autre problème avec un autre sous programme qui marche très bien, toutefois le problème est que les données sont en mémoire uniquement lors de l'exécution,après fermeture et réouverture du programme plus aucune donnée sauvegardée, comment faire? Merci beaucoup d'avance

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Qie,

    Pour commencer, as-tu compris que chaque utilisation de rewrite vide le fichier ?

    Pour utiliser un fichier :

    - On teste son existence

    NON ==> on le crée (avec rewrite)

    OUI ==> on passe à la suite ... lecture, ...

    et on n'oublie pas de le fermer quand on a fini.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Oui ça j'ai bien compris,merci, je n'avais pas fais attention à cela, mais comment ce fait-il que maintenant plus de compilation? .

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Qua,

    Il faudrait en montrer plus.

    Manifestement, classesChambre est déclaré somme type de fichier, et des instructions comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    assign(classesChambre, 'classroom.ods');
                    ....
    ne peuvent pas compiler : un type n'est pas une variable.

    Pour ta procédure, la variable est Tab, et comme il s'agit d'un fichier, tu ne peux pas l'utiliser avec un indice comme Tab[i] !!

    Je crois qu'il faut que tu retournes voir un cours.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Classeschambre(avec un s) est bien un fichier que j'ai déclaré(voir mon 1er message), et Tab est bien un tableau et non pas un fichier, donc normalement je peux mettre l'indice.

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Hoa,
    Citation Envoyé par dalfred Voir le message
    Classeschambre(avec un s) est bien un fichier que j'ai déclaré(voir mon 1er message), et Tab est bien un tableau et non pas un fichier, donc normalement je peux mettre l'indice.
    Alors ta déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure descriptionHotel( var Tab : classeChambre);
    est complétement farfelue, et ça confirme ce que j'ai déjà écrit : il faut que tu reprennes un cours.

    Et cette fois j'ajoute : il faut carrément le reprendre à zéro, et ne pas vouloir courir avant de savoir marcher.
    Si les cons volaient, il ferait nuit à midi.

  11. #11
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Voici un exemple de correction fonctionnelle, qui à mon sens est la façon la plus "propre" à utiliser dans un programme Pascal.
    Ne sachant pas quel compilateur tu utilise, j'ai fait un code compatible (en toute logique) pour Turbo Pascal.

    J'ai commenté sommairement pour que tu comprenne les mécanismes mis en place, ce qui n'est pas commenté est, je pense, facile à comprendre. Tu peux voir le résultat dans l’aperçu.

    Donc maintenant, bonne analyse !

    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
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
     
    program Renseignements;
     
    // Nombre maximum de chambres
    const
      MAXROOMS = 100;
     
    // Classe Hotel (c'est l'hotel qui contient toute les données)
    // on utilise le type object car c'est la déclaration la plus simple
    // existante pour créer une classe.
    // Il facilite également l'enregistrement des données !
    type
      THotel = object
         Count      : integer; // Nombre de chambre dans l'hotel
         Types      : integer; // Nombre de types de chambres
         Services   : integer; // Nombre de services
         Rooms      : array[0..MAXROOMS-1] of integer; // Classes des chambres
     
         procedure Initialize;
         // Initialise l'objet, à appeler en début de programme
     
     
         function SaveToFile(aFilename: string):integer;
         // Sauvegarde l'objet THotel dans le fichier aFileName
     
         function LoadFromFile(aFilename: string):integer;
         // Charge un fichier aFileName dans l'objet THotel
     
         // Méthodes pour demander les informations à l'utilisateur
         procedure giveAll; // demande toutes les informations à la suite
           procedure giveCount;
           procedure giveTypes;
           procedure giveServices;
           procedure giveRooms;
     
         // Méthodes pour afficher les informations à l'écran
         procedure showAll; // Affiche toutes les informations
           procedure showCount;
           procedure showTypes;
           procedure showServices;
           procedure showRooms;
      end;
     
    // Taille d'un objet THotel
    const
      SizeOfHotel = SizeOf(THotel);
     
     
    { THotel }
     
    procedure THotel.giveAll;
    begin
      Initialize;
     
      giveCount;
      giveTypes;
      giveServices;
      giveRooms;
    end;
     
     
    procedure THotel.giveCount;
    var V: integer;
    begin
      V := 0;
      while (V < 1) or (V > MAXROOMS) do
      begin
        write('Quel est le nombre de chambres de l''hotel (entre 1 et ', (MAXROOMS),') ? ');
        Readln(V);
        if V > MAXROOMS then
          writeln('   ! chiffre trop grand : ', V)
        else
        if V < 1 then
          writeln('   ! chiffre trop petit : ', V);
      end;
      Count := V;
      writeln('');
    end;
     
    procedure THotel.giveRooms;
    var V,N: integer;
    begin
      for N := 0 to Count-1 do
      begin
        V := 0;
        while (V < 1) or (V > 5) do
        begin
          write('Qu''elle est la classe de la chambe', N+1,' (1 à 5) ? ');
          Readln(V);
          if V > 5 then
            writeln('   ! chiffre trop grand : ', V)
          else
          if V < 1 then
            writeln('   ! chiffre trop petit : ', V);
        end;
        Rooms[N] := V;
      end;
      writeln('');
    end;
     
    procedure THotel.giveServices;
    var V: integer;
    begin
      V := 0;
      while (V < 1) or (V > 100) do
      begin
        write('Quel est le nombre de services que propose l''hotel (1 a 100) ? ');
        Readln(V);
        if V > 100 then
          writeln('   ! chiffre trop grand : ', V)
        else
        if V < 1 then
          writeln('   ! chiffre trop petit : ', V);
      end;
      Services := V;
      writeln('');
    end;
     
    procedure THotel.giveTypes;
    var V: integer;
    begin
      V := 0;
      while (V <= 0) or (V > 10) do
      begin
        write('Combien y''a t''il de type de chambres dans l''hotel (1 a 10) ? ');
        Readln(V);
        if V > 10 then
          writeln('   ! chiffre trop grand : ', V)
        else
        if V <= 0 then
          writeln('   ! chiffre trop petit : ', V);
      end;
      Types := V;
      writeln('');
    end;
     
    procedure THotel.Initialize;
    var N: integer;
    begin
      Count := 0;
      Services := 0;
      Types := 0;
      for N := 0 to MAXROOMS-1 do
        Rooms[N] := 0;
    end;
     
    function THotel.LoadFromFile(aFilename: string):integer;
    var f: file of byte;
        p: ^byte;
    begin
      Initialize;
      {$I-} // <- interruption des erreurs de fichiers
      assign(f, aFileName); // assignation au fichier
      reset(f); // ouverture pour la lecture
      result := IOResult;
      if IOResult = 0 then // si pas de probleme
      begin
        // lire les données en une seule fois !
        p := @self; // <- on pointe l'objet THotel comme etant une suite d'octets
        blockRead(f, p^, SizeOfHotel); // <- on écrit cette suite d'octets
        result := IOResult;
      end;
      close(f); // libérer le fichier
      {$I+}
    end;
     
    function THotel.SaveToFile(aFilename: string):integer;
    var f: file of byte;
        p: ^byte;
    begin
      {$I-}
      assign(f, aFileName);
      rewrite(f);
      result := IOResult;
      if IOResult = 0 then
      begin
        p := @self;
        blockWrite(f, p^, SizeOfHotel);
        result := IOResult;
      end;
      close(f);
      {$I+}
    end;
     
    procedure THotel.showAll;
    begin
      showCount;
      showTypes;
      showServices;
      showRooms;
    end;
     
    procedure THotel.showCount;
    begin
      writeln('Nombres de chambres         : ', Count);
      writeln('');
    end;
     
    procedure THotel.showRooms;
    var N: integer;
        NS, RS: string;
    begin
      writeln('+------------+------------+------------+------------+------------+------------+');
      writeln('| ch. classe | ch. classe | ch. classe | ch. classe | ch. classe | ch. classe |');
      writeln('+------------+------------+------------+------------+------------+------------+');
      write('| ');
      for N := 0 to Count - 1 do
      begin
        str(N+1, NS);
        case Length(NS) of
          1 : write(NS+'   ');
          2 : write(NS+'  ');
          3 : write(NS+' ');
        end;
     
        case Rooms[N] of
          1 : write('*     ');
          2 : write('**    ');
          3 : write('***   ');
          4 : write('****  ');
          5 : write('***** ');
        end;
     
        if (((N+1) mod 6) = 0) or (N = Count-1) then
        begin
          writeln(' |');
          writeln('+------------+------------+------------+------------+------------+------------+');
          if (N < count-1) then
            write('| ');
        end
        else
          write(' | ');
      end;
    end;
     
    procedure THotel.showServices;
    begin
      writeln('Nombres de services         : ', Services);
      writeln('');
    end;
     
    procedure THotel.showTypes;
    begin
      writeln('Nombres de types de chambre : ', types);
      writeln('');
    end;
     
    var Hotel : THotel;
        n     : integer;
    begin
    // Initialisation -----------------------
      Hotel.Initialize;
     
    // test 1 Remplissage aléatoire -----------------------
      Hotel.Count := 50;
      Hotel.Types := 2;
      Hotel.Services := 3;
      for n := 0 to MAXROOMS-1 do
        Hotel.Rooms[n] := random(5)+1;
     
      // Sauvegarde
      Hotel.SaveToFile(ParamStr(0)+'.intarray');
     
     
    // test 2 Chargement -----------------------
      Hotel.LoadFromFile(ParamStr(0)+'.intarray'); // appel automatiquement Initialize
     
      // Affichage
      Hotel.showAll;
     
     
    // test 3  Remplissage manuel -----------------------
      Hotel.giveAll; // appel automatiquement Initialize
     
      // Affichage
      Hotel.showAll;
     
      // Sauvegarde
      Hotel.SaveToFile(ParamStr(0)+'.intarray');
     
     
     
    // * FIN * //
      readLn;
    end.
    Images attachées Images attachées  
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup Dr.Who ! j'utilise geany mais le programme est fonctionnelle, je vais me mettre maintenant à l'analyse ! merci encore et bonne fin de journée

Discussions similaires

  1. sauvegarder les données
    Par mnssylvain dans le forum WinDev
    Réponses: 21
    Dernier message: 18/03/2008, 00h06
  2. [FBDataset] quoi mettre pour sauvegarder les données du DBGrid
    Par Boublou dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 09/06/2007, 19h34
  3. Réponses: 7
    Dernier message: 02/10/2006, 18h55
  4. Sauvegarder les données d'un FormPage
    Par couetbis dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 05/06/2006, 14h30
  5. Sauvegarder les données dans un fichier CSV
    Par beb30 dans le forum MFC
    Réponses: 5
    Dernier message: 08/03/2006, 14h06

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