Pascal中的read()文件

时间:2016-10-19 17:25:42

标签: file pascal

我有一个记录和一个记录文件。我无法阅读该文件的内容。我尝试从文件中读取并将数据保存到名为MiGuarde的记录中。当我尝试打印MiGuarde(我的文件中有数据)时,它什么也没显示。

^([^\d]{2}|\d[^\d]|[^\d]\d|.|.{3}.*)$

1 个答案:

答案 0 :(得分:2)

你的(显然不完整)程序有太多问题。例如,您对文件执行重置操作,然后尝试写入它 - 这不可能成功。对于写入,您必须使用重写打开文件。将读写操作隔离成单独的函数可能更容易/更安全。

你需要更加努力地学习Pascal。此外,告诉我们它应该做什么会更容易,因为我的西班牙语[?]是没有希望的。

您还需要组织代码,使其更具可读性/可管理性。

例如,您可以创建单独的函数来读取和写入记录。这将使您的工作更轻松。以下示例与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.

希望这有帮助。