2016-10-19 73 views
0

我有一條記錄和一條記錄文件。我無法閱讀文件的內容。我嘗試從文件中讀取數據並將其保存到名爲MiGuarde的記錄中。當我嘗試打印MiGuarde(以及我的文件上的數據)時,它什麼也沒有顯示。在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

你確定'read(G,MiGuarde);'etc是否實際執行?順便說一句你使用的是什麼Pascal編程環境? – MartynA

+0

@MartynA:我懷疑Turbo Pascal 3,因爲'TP3 Algoritmos \ GUARDERIAS.DAT'。 –

回答

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; 

這是有點難以遵循您的代碼的邏輯。我想你正在嘗試創建一個包含多條記錄的數據庫,而不是一條記錄。所以,如果有很多記錄,你是否也需要在更新記錄時詢問用戶的記錄號碼?

下面是我的嘗試,使您的代碼功能和一點可讀性,但不改變其當前的邏輯,我不知道我完全遵循,並且它似乎不完整。另外,我Google將它翻譯成英文,希望能更好地理解它。

至少它應該證明(對你)寫作和閱讀記錄確實有效。

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. 

希望這會有所幫助。