2016-10-19 6 views
0

私はレコードとレコードファイルを持っています。私はファイルの内容を読むことができません。私はファイルから読み込み、MiGuardeというレコードにデータを保存しようとします。私がMiGuardeを印刷しようとすると(私のファイルにデータがあります)、何も表示されません。パスカルのread()ファイル

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

'read(G、MiGuarde);などが実際に実行されていますか?どのようなパスカルプログラミング環境を使用していますか? – MartynA

+0

@MartynA:TP3 Algoritmos \ GUARDERIAS.DATのため、Turbo Pascal 3が疑わしい。 –

答えて

2

あなたの(明らかに不完全な)プログラムには多大な問題があります。たとえば、ファイルに対して[リセット]操作を実行した後、書き込みを試みると、成功する可能性がありません。執筆のためには、ファイルをRewriteで開く必要があります。読み書き操作を別々の機能に分離する方が簡単で安全です。

パスカルを少し勉強する必要があります。また、私のスペイン語が絶望的なので、それが何をすべきかを教えてもらいやすいでしょう。

また、読みやすく管理しやすいようにコードを整理する必要があります。

たとえば、レコードの読み書き用に別々の関数を作成することができます。これはあなたの仕事を楽にします。次の例は、Freepascal/Turbo Pascalと互換性があります。 (あなたはあなたが使っているPascalコンパイラ/方言についても言及していません)元のバージョンに近いレコードをグローバルに保存しましたが、これをこれらの関数のパラメータとして渡すこともできます。

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; 

コードのロジックに従うのは少し難しいです。私はあなたが単一のレコードではなく、多くのレコードのデータベースを作成しようとしていると思います。したがって、多くのレコードがある場合は、レコードを更新する際にレコード番号を確認する必要はありませんか?

以下は、コードを機能的にして読みやすいようにするための試みですが、現在のロジックを変更することなく、完全にフォローしているかどうかは不明ですが、不完全なようです。また、私はそれをよりよく理解したいと思って英語に翻訳しました。

少なくとも、書き込みと読み取りの両方の記録が必要であることを証明する必要があります。

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. 

これが役に立ちます。

関連する問題