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

时间:2017-01-16 00:54:09

标签: binaryfiles freepascal records untyped-variables

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

允许使用文件类型存储数据,我确实喜欢这个:pascal-programming

而且,这是我迄今取得的成就:

  1. 我尝试将记录数据写入Untyped文件而不是

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

  3. Open(var f: File; var data)

    data =表示可以接收“任何东西”。 cmiiw

    1. 我这样做的原因,我不认为一遍又一遍地重新创建相同的功能是个好主意,例如:当使用3个或更多不同的“记录”时 < / p>

    2. 我还遇到了一个问题,即文件无法将实际二进制文件存储或备份到临时“记录”变量,它总是给出0值。

    3. 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仍然不支持Generic Programming。太伤心了,真的。 您可能需要考虑阅读this引用。

1 个答案:

答案 0 :(得分:1)

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

考虑代码:

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;

未实施错误处理。 代码示例作为指导,但不完整。 它提供了一个基本框架,用于打开和关闭员工文件,以及在文件中的特定位置(特定记录)进行读写。

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

    1. 打开文件。
    2. 阅读您想要的所有记录。
    3. 关闭文件。