2016-10-19 5 views
0

J'ai un enregistrement, et un fichier d'enregistrements. Je ne peux pas lire le contenu du fichier. J'essaie de lire à partir du fichier et enregistrer les données dans un enregistrement appelé MiGuarde. Lorsque j'essaie d'imprimer MiGuarde (et j'ai des données sur mon fichier), cela ne montre rien.fichier read() en Pascal

uses crt; 

type GUARDERIA = record nombre, direccion : string[20]; 
         total_caniles, cantidad_caniles, nro_mascota : integer; 
         valor_canil : real; 
         end; 


    GU = file of GUARDERIA; 


var eleccion : integer; G : GU; 
    MiGuarde : GUARDERIA; 


procedure CREAR_GUARDERIA; 

begin 

      assign(G,'C:\Users\MACIEL\Desktop\TP3 Algoritmos\GUARDERIAS.DAT'); 
      reset(G); 

     if eof(G) then begin 
           writeln('Ingrese el nombre de la Guarderia: '); 
           readln(MiGuarde.nombre); 
           writeln('Ingrese el total de caniles : '); 
           readln(MiGuarde.cantidad_caniles); 
           MiGuarde.nro_mascota := 0; 
           writeln('Ingrese el valor por dia: '); 
           readln(MiGuarde.valor_canil); 
           writeln('Ingrese la direccion: '); 
           readln(MiGuarde.direccion); 

           write(G,MiGuarde); 

           end 
        else begin 
             writeln('Ingrese el nuevo valor de estadia o "0" para salir'); 
           readln(eleccion); 
           if eleccion > 0 then begin 
                  MiGuarde.valor_canil := eleccion; 
                  write(G,MiGuarde); 
                 end; 
           end; 

           reset(G); 
           read(G,MiGuarde); 
           writeln(MiGuarde.nombre,'-',MiGuarde.cantidad_caniles); 
           readkey; 

     close(G); 

end; 



begin 


    repeat 
      ClrScr; 
      writeln('MENU'); 
      writeln(); 
      writeln('1. Generar guarderia (o modificar valor).'); 
      writeln('8. Salir.'); 
      writeln(); 
      writeln('- '); 
      readln(eleccion); 

      case eleccion of 
      1 : CREAR_GUARDERIA; 
      8 : exit; 
      end; 
     until eleccion = 8; 
     readkey; 

end. 
+0

Êtes-vous certain 'lire (G, MiGuarde),' etc exécute en fait? Btw quel environnement de programmation Pascal utilisez-vous? – MartynA

+0

@MartynA: Je suspecte Turbo Pascal 3, à cause de 'TP3 Algoritmos \ GUARDERIAS.DAT'. –

Répondre

2

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.