Votre programme (évidemment incomplet) comporte trop de problèmes. Par exemple, vous effectuez une opération de réinitialisation sur le fichier, puis essayez d'y écrire - ce qui ne peut pas réussir. Pour l'écriture, vous devez ouvrir le fichier avec Rewrite. Il est peut-être plus facile/plus sûr d'isoler les opérations de lecture et d'écriture dans des fonctions séparées.
Vous avez besoin d'étudier Pascal un peu plus difficile. En outre, il serait plus facile de nous dire ce qu'il est censé faire, car mon espagnol [?] Est sans espoir.
Vous devez également organiser votre code afin qu'il soit plus lisible/facile à gérer.
Par exemple, vous pouvez créer des fonctions distinctes pour la lecture et l'écriture des documents. Cela rendra votre travail plus facile. L'exemple suivant est compatible avec Freepascal/Turbo Pascal. (Vous ne mentionnez pas non plus quel compilateur/dialecte Pascal vous utilisez.) J'ai gardé l'enregistrement global pour être plus proche de votre version originale, mais vous pouvez également passer cela en paramètre à ces fonctions.
function ReadRec(n: Integer): Boolean;
begin
ReadRec := False; // assume failure
Assign(G,'data.dat');
{$I-} Reset(G); {$I+}
if IOResult <> 0 then exit;
Seek(G,n);
if not eof(G) then begin
Read(G,MyStore);
ReadRec := True;
end;
Close(G);
end;
function WriteRec(n: Integer): Boolean;
begin
WriteRec := False; //assume failure
Assign(G,'data.dat');
{$I-} Rewrite(G); {$I+}
if IOResult <> 0 then exit;
Seek(G,n);
Write(G,MyStore);
Close(G);
WriteRec := True;
end;
Il est un peu difficile de suivre la logique de votre code. Je suppose que vous essayez de créer une base de données de nombreux enregistrements, et pas un seul enregistrement. Donc, si vous avez plusieurs enregistrements, n'avez-vous pas besoin de demander à votre utilisateur de travailler sur le numéro d'enregistrement lors de la mise à jour d'un enregistrement?
ci-dessous est ma tentative de rendre votre code fonctionnel et un peu plus facile à lire, mais sans changer sa logique actuelle, que je ne suis pas sûr que je suis tout à fait, et il semble incomplet. De plus, je l'ai traduit en anglais en espérant mieux le comprendre.
Au moins, il faut prouver (pour vous) que l'écriture et la lecture des enregistrements ne fonctionne comme il se doit.
type
GUARDERIA = record
nombre,
direccion : string[20];
total_caniles,
cantidad_caniles,
nro_mascota : integer;
valor_canil : real;
end;
GU = file of GUARDERIA;
var
choice : integer;
G : GU;
MyStore : GUARDERIA;
////////////////////////////////////////////////////////////////////////////////
procedure PrintRec;
begin
with MyStore do begin
Writeln('Name ',nombre);
Writeln('Address ',direccion);
Writeln('Number of pets ',total_caniles);
Writeln('Cantidad caniles ',cantidad_caniles);
Writeln('Number of pets ',nro_mascota);
Writeln('Num. of stay days ',valor_canil);
end;
end;
////////////////////////////////////////////////////////////////////////////////
function ReadRec(n: Int64): Boolean;
begin
ReadRec := False; // assume failure
Assign(G,'data.dat');
{$I-} Reset(G); {$I+}
if IOResult <> 0 then exit;
Seek(G,n);
if not eof(G) then begin
Read(G,MyStore);
ReadRec := True;
end;
Close(G);
end;
////////////////////////////////////////////////////////////////////////////////
function WriteRec(n: Int64): Boolean;
begin
WriteRec := False; //assume failure
Assign(G,'data.dat');
{$I-} Rewrite(G); {$I+}
if IOResult <> 0 then exit;
Seek(G,n);
Write(G,MyStore);
Close(G);
WriteRec := True;
end;
////////////////////////////////////////////////////////////////////////////////
procedure InputRec;
begin
Write('Enter the name : ');
Readln(MyStore.nombre);
Write('Enter the number of dogs: ');
Readln(MyStore.cantidad_caniles);
MyStore.nro_mascota := 0;
Write('Enter the number of days: ');
Readln(MyStore.valor_canil);
Write('Enter the address : ');
Readln(MyStore.direccion);
end;
////////////////////////////////////////////////////////////////////////////////
procedure AddRec;
begin
if not ReadRec(0) then begin //create first record if empty file
InputRec;
WriteRec(0);
end;
PrintRec;
Writeln('Enter the stay days, or "0" to exit');
Readln(choice);
if choice > 0 then begin
MyStore.valor_canil := choice;
WriteRec(0);
end;
Writeln(MyStore.nombre,'-',MyStore.cantidad_caniles);
end;
////////////////////////////////////////////////////////////////////////////////
begin
repeat
Writeln('MENU');
Writeln;
Writeln('1. Create new record (or modify value)');
Writeln('0. Exit');
Writeln;
Writeln('- ');
Readln(choice);
case choice of
1 : AddRec;
0 : Break;
end;
until False;
Writeln('Bye');
end.
Espérons que cela aide.
Êtes-vous certain 'lire (G, MiGuarde),' etc exécute en fait? Btw quel environnement de programmation Pascal utilisez-vous? – MartynA
@MartynA: Je suspecte Turbo Pascal 3, à cause de 'TP3 Algoritmos \ GUARDERIAS.DAT'. –