在 Pascal 中从/向 Untyped 文件读取/写入不同的记录数据?

Read / write different Records data from / to Untyped files in Pascal?

我在大学里有一个编程项目。

允许使用文件类型来存储数据,我就是这样做的:pascal-programming

而且,这是我到目前为止所取得的成就:

  1. 我尝试将 Records 数据写入 Untyped 文件,结果成功了

  2. 我想用动态参数覆盖一个函数(例如:我可以切换我想处理的记录,在这种情况下有 2 个不同的 "Records")。

Open(var f: File; var data)

data=表示可以接收"anything"。 cmiiw

  1. 我这样做的原因是,我不认为一遍又一遍地重新创建相同的函数是个好主意,例如:当使用 3 个或更多不同的 "Records"

  2. 我还遇到了文件无法将实际二进制文件存储或备份到临时 "Records" 变量的问题,它总是给出 0 值。

go to my github source code

我这里的解决方案没有提供任何通用的相关程序(检查最后一句话):

program test_untyped;
{ A crude database recording }
uses crt;
type
   Temployee = record
                  name    : string[20];
                  address : string[40];
                  phone   : string[15];
                  age     : byte;
                  salary  : longint;
               end;
    arr_employee = array[1..100] of Temployee;

var
   F : File;
   c : char;
  //  r : Temployee;
   r, realR : arr_employee;
   s : string;
   i, j, n : integer;

procedure fRead;
begin
  seek(F, 0);
  i := 0;
  repeat
    clrscr;
    inc(i);
    writeln('increment: ', i); readln;
    writeln('File position : ',filepos(F));
    blockRead(F, r[i], sizeOf(Temployee));
    writeln('Name    = ', r[i].name);     { Input data }
    writeln('Address = ', r[i].address);
    writeln('Phone   = ', r[i].phone);
    writeln('Age     = ', r[i].age);
    writeln('Salary  = ', r[i].salary);
    write('Show data again (Y/N) ?');
    repeat
        c:=upcase(readkey);      { Ask user : Input again or not }
    until c in ['Y','N'];
    writeln(c);
    // realR[i] := r[i]; // backup, to show later
  until c='N';
end; // end fRead

procedure fWrite;
begin
  seek(F, filesize(F));
  repeat
    clrscr;
    inc(i);
    writeln('berapa nilai i: ', i);
    writeln('File position : ',filepos(F));
    write('Name    = '); readln(r[i].name);     { Input data }
    write('Address = '); readln(r[i].address);
    write('Phone   = '); readln(r[i].phone);
    write('Age     = '); readln(r[i].age);
    write('Salary  = '); readln(r[i].salary);
    blockWrite(F, r[i], sizeOf(Temployee)); { Write data to file }
    write('Input data again (Y/N) ?');
    repeat
        c:=upcase(readkey);      { Ask user : Input again or not }
    until c in ['Y','N'];
    writeln(c);
  until c='N';
end;

// procedure fDelete;
// var
//   nama: string;
//   delElement: integer;
//   tempR: Temployee;
// begin
//   seek(F, 0);
//   write('search your data by name: '); readln(nama);
//   while not eof(F) do
//   begin
//     writeln('file position: ', filePos(F));
//     blockRead(F, tempR, sizeOf(Temployee));
//     if (nama = tempR.name) then
//     begin
//       delElement := filePos(F);
//     end else
//     begin
//       // seek(F, )
//       blockWrite(F, tempR, sizeOf(Temployee));
//     end;
//   end;
// end; // end fDelete

procedure fDisplay;
begin
  writeln('nilai i saat ini: ', i); readln;
  for j := 1 to i do
  begin
    clrscr;
    writeln('Name    = ', r[j].name);     { Input data }
    writeln('Address = ', r[j].address);
    writeln('Phone   = ', r[j].phone);
    writeln('Age     = ', r[j].age);
    writeln('Salary  = ', r[j].salary);
    readln;
  end;
end;

begin
   clrscr;
  //  write('Input file name to record databases : '); readln(s);
   s := 'coba1.dat';

   assign(F,s);           { Associate it }
   {$I-}
   reset(F, sizeOf(Temployee));           { First, open it }
   {$I+}

   n:=IOResult;
   if n<>0 then           { If it's doesn't exist then }
   begin
      {$I-}
      rewrite(F, sizeOf(Temployee));      { Create it    }
      {$I+}
      n:=IOResult;
      if n<>0 then
      begin
         writeln('Error creating file !'); halt;
      end;
   end
   else
   begin                  { If it exists then }
      n:=filesize(F);     { Calculate total record }
      // seek(F,n);          { Move file pointer PAST the last record }
   end;

   fileMode := 2;
   reset(F, sizeOf(Temployee));
   fRead;
   fWrite;
   // fDelete;
   fDisplay;
  close(F);
end.

我想知道 Pascal 是否可以用于泛型编程? 至少这个学期在我的大学里使用 Pascal XD

谢谢你和最好的问候,

编辑: 直到我发布这个问题的那一天,Pascal 仍然不支持通用编程。好伤心,真的。 您可能想考虑改为阅读 this 参考资料。

我不明白这里的主要问题,但建议使用类型化文件而不是非类型化文件。 未类型化的文件更难维护,并且(在我看来)没有任何好处。

考虑代码:

type
   Temployee = record
                  name    : string[20];
                  address : string[40];
                  phone   : string[15];
                  age     : byte;
                  salary  : longint;
               end;
VAR
  fEmployee : File Of Temployee;
  Employees : ARRAY[0..100] Of Temployee;
  Employee  : Temployee;

PROCEDURE OpenEmployeeFile(CONST TheFileName:AnsiString);
  BEGIN
    AssignFile(fEmployee,TheFileName);
    IF FileExistsUTF8(TheFileName) { *Converted from FileExists* }
    THEN Reset(fEmployee)
    ELSE Rewrite(fEmployee);
  END;

PROCEDURE CloseEmployeeFile;
  BEGIN
    Close(fEmployee);
  END;

FUNCTION ReadEmployee(Position:WORD): Temployee;
  BEGIN
    Seek(fEmployee,Position);
    Read(fEmployee,Result);
  END;

PROCEDURE WriteEmployee(CONST Employee:Temployee; Position:WORD);
  BEGIN
    Seek(fEmployee,Position);
    Write(fEmployee,Employee);
  END;

错误处理未实现。 代码示例作为指南,并不完整。 它提供了打开和关闭文件的基本框架employee-file,以及在文件中特定位置(特定记录)的读写。

  1. 打开文件。
  2. 写下你想要的所有记录。
  3. 关闭文件。

或者。

  1. 打开文件。
  2. 你要的记录都读完了。
  3. 关闭文件。