Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal
Pascal Forum d'entraide sur la programmation en langage Pascal et sur les EDI. Avant de poster -> la F.A.Q Pascal, les cours
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/11/2012, 13h47   #1
dalfred
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 0
Points : 0
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 :
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.
dalfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 14h03   #2
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 418
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 418
Points : 3 773
Points : 3 773
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.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2012, 14h06   #3
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 392
Points : 3 392
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 14h22   #4
dalfred
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 0
Points : 0
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 :
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.
dalfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 19h19   #5
dalfred
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 0
Points : 0
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
dalfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 19h51   #6
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 418
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 418
Points : 3 773
Points : 3 773
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.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2012, 20h24   #7
dalfred
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 0
Points : 0
Oui ça j'ai bien compris,merci, je n'avais pas fais attention à cela, mais comment ce fait-il que maintenant plus de compilation? .
dalfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 00h33   #8
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 418
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 418
Points : 3 773
Points : 3 773
Qua,

Il faudrait en montrer plus.

Manifestement, classesChambre est déclaré somme type de fichier, et des instructions comme
Code :
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.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 11h44   #9
dalfred
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 0
Points : 0
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.
dalfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 14h02   #10
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 418
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 418
Points : 3 773
Points : 3 773
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 :
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.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2012, 04h02   #11
Dr.Who
Membre Expert
 
Avatar de Dr.Who
 
Inscription : septembre 2009
Messages : 980
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : septembre 2009
Messages : 980
Points : 1 175
Points : 1 175
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 :
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
Type de fichier : jpg Sans-titre-1.jpg (133,7 Ko, 9 affichages)
__________________
[ 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!
Dr.Who est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 24/11/2012, 16h38   #12
dalfred
Invité de passage
 
Homme
Inscription : novembre 2012
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : novembre 2012
Messages : 6
Points : 0
Points : 0
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
dalfred est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h51.


 
 
 
 
Partenaires

Hébergement Web