我有一个记录和一个记录文件。我无法阅读该文件的内容。我尝试从文件中读取并将数据保存到名为MiGuarde的记录中。当我尝试打印MiGuarde(我的文件中有数据)时,它什么也没显示。
^([^\d]{2}|\d[^\d]|[^\d]\d|.|.{3}.*)$
答案 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.
希望这有帮助。