【问题标题】:Reading record from a text file into array in Pascal将文本文件中的记录读入 Pascal 中的数组
【发布时间】:2014-05-09 21:17:45
【问题描述】:

1.这是我的代码,我想将文本文件中的记录读入帕斯卡的数组中文本文件并将其存储在数组中..但我面临错误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}

【问题讨论】:

  • 在主程序中我只是调用程序(Read_Data)
  • 自从我这样做了很长时间,但它不应该读取 df 作为它的第一个参数,那是你的文件。

标签: pascal freepascal


【解决方案1】:

您在var 块中声明了两个Text 类型的变量(dff)。

你用这些行打开df

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

然后您从f不是您在上面打开的文件)中读取几行,例如这一行:

Read (f, num);

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

close(df);

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

  1. 只声明你真正需要的变量。
  2. 使用您声明的变量。

您的循环也无效,因为您使用的是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。)

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

【讨论】:

  • 感谢您的建议@KenWhite 我会尝试遵循它....但我将“DF”声明为文本而不是“文本文件”,所以我将它放在硬盘上并编辑通过文本编辑器(记事本)文件我的意思是我不必将数据放入我的文件中数据已经存在于文件中所以我应该从文件中读取 RoomData 并将其存储在数组中以在我的程序中使用它.. ..我的pascal版本不支持这个
  • 我必须使用 DF: text 我希望我可以用二进制文件来做它会更容易,但我有义务使用文本
  • 好吧,我回答的前 9 或 10 段向您解释了如何修复您的代码以使其工作,如果这是您必须做的。
猜你喜欢
  • 1970-01-01
  • 2020-01-20
  • 2010-09-29
  • 1970-01-01
  • 2013-04-01
  • 2010-12-20
  • 2012-10-20
  • 1970-01-01
相关资源
最近更新 更多