将文本文件中的记录读入Pascal中的数组

时间:2014-05-09 21:17:45

标签: pascal freepascal

1.这是我的代码我想从文本文件中读取记录到pascal中的数组我的程序是关于建立一个酒店助手我已经有一个文本文件与酒店的数据然后我应该从文本文件并将其存储在数组..但我面临错误103退出代码(文件未打开)....任何帮助请。 :)

程序Hotel1(输入,输出);

const  max =10;  MaxFloor =10;
type
Date = record
        day :1..31;
        month:1..12;
        year:integer;
       end;


Booking = record
           Guest:string[20];
           S_Date:date;
           E_date:date;
          end;


Booking_Mat= array[1..max] of Booking;

History_Booking = record
                   B_num:integer;
                   B_Mat:Booking_Mat;
                  end;

Room = record
        Num:integer;
        Bed_num:integer;
        Price:integer;
        Status:Boolean;
        H:History_Booking;
       end;

Data = record
       Ro:Room;
       m:integer;
       end;

Data_mat= array [1..max] of Data;



Procedure  Read_Data(filename:string; var table:Data_mat);
 var   df:text; i,j :integer;
  n,m,num,GN:integer;
  Bed_num,Price:integer;
  f:text;
  s,e:Date;
  Gname:string[20];
  ok:boolean;
  a:Data_mat;
 c:char;
 Begin
 writeln('Reading ',filename,' records into array.... ');
 assign(df,filename);
 reset(df);
i:=0;
   while (not eof) do
     begin
        i:=i+1;
         Read (f,num);
         a[i].Ro.num:=num;
         Read (f,Bed_num);
         a[i].Ro.Bed_num:=Bed_num;
         Read (f,Price);
      a[i].Ro.Price:=Price;
         Read(f,c);
          if (c ='Y') then
           a[i].Ro.status:= true
       else
           a[i].Ro.status:= false;

      readln;

  End; {while eof}
  close(df);
End; {Read_Data}

1 个答案:

答案 0 :(得分:0)

您已在Text区块中声明了df,(fvar)类型的两个变量。

您可以使用以下行打开df

assign(df,filename);
reset(df);

然后,你可以在几行中读取f上面打开的文件),例如:

Read (f, num);

有趣的是,您实际上设法关闭了您真正打开的文件,即使您从未在循环中使用它:

close(df);

所有这些问题的解决方案是删除fdf的声明,然后通过更正代码以使用剩余的text来修复您获得的编译器错误变量。 (这里有两个重要的经验教训

  1. 仅声明您实际需要的变量。
  2. 使用您声明的变量。
  3. 您的循环也无效,因为您正在使用while not eof而没有提供测试结束的文件。您的循环应改为while not Eof(df) do

    遵循使用T为类型添加前缀的典型命名约定也要好得多。它清楚地表明它是一种类型而不是变量,并允许您更容易地阅读代码。例如,我将Data的定义更改为TRoomData,并相应地更改其他类型的声明。这是一个示例 - 请注意TRoomData现在有一个名为Room的字段{成员} TRoom

    TRoomData = record
      Room: TRoom;
      m: Integer;
    end;
    

    TRoom定义为

    TRoom = record
      Num: Integer;
      Bed_num: Integer;
      Price: Integer;
      Status: Boolean;
      H: THistory_Booking;
    end;
    

    等等。这使您可以更清楚地编写代码:

    var
      RoomData: TRoomData;
    begin
      RoomData.Room.Num := 1;
      RoomData.Room.Price := 50;
      // etc.
    end;
    

    尽管如此,您的文件不包含text,因此您首先使用df: Text使用了错误的文件类型。您应该使用File of TRoomData,允许您一次读取和写入整个记录。这是一个这样做的例子:

    var
      DF: File of TRoomData;
      RoomData: TRoomData;
      i: Integer;
    const
      DataFileName = 'D:\TempFiles\RoomData.dat';
    

    写它:

    // Put some data into the record
    RoomData.Room.Num := 1;
    RoomData.Room.Bed_num := 1;
    RoomData.Room.Price := 40;
    RoomData.Room.Status := True;
    RoomData.Room.H.B_num := 1;
    for i := 1 to Max do
    begin
      RoomData.Room.H.B_Mat[1].Guest := Format('Guest %d', [i]);
      RoomData.Room.H.B_Mat[1].S_Date.Year := 2014;
      RoomData.Ro.H.B_Mat[1].S_Date.Month := i;
      RoomData.Ro.H.B_Mat[1].S_Date.Day := i;
    end;
    
    // Write it out to the file
    AssignFile(DF, DataFileName);
    try
      Rewrite(DF);
      Write(DF, RoomData);
    finally
      CloseFile(DF);
    end;
    

    回读:

    AssignFile(DF, DataFileName);
    try
      Reset(DF);
      Read(DF, RoomData);
    finally
      CloseFile(DF);
    end;
    

    (或者,更好的是:如果您使用的Pascal版本支持它,请远离旧文件I / O例程并开始使用TFileStream。)

    最后但并非最不重要的是,学习正确格式化代码。它使调试和维护变得更加容易,并且当您可以清楚地遵循执行路径时,它更容易阅读。