1.这是我的代码我想从文本文件中读取记录到pascal中的数组我的程序是关于建立一个酒店助手我已经有一个文本文件与酒店的数据然后我应该从文本文件并将其存储在数组..但我面临错误103退出代码(文件未打开)....任何帮助请。 :)
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}
答案 0 :(得分:0)
您已在Text
区块中声明了df
,(f
和var
)类型的两个变量。
您可以使用以下行打开df
:
assign(df,filename);
reset(df);
然后,你可以在几行中读取f
(不上面打开的文件),例如:
Read (f, num);
有趣的是,您实际上设法关闭了您真正打开的文件,即使您从未在循环中使用它:
close(df);
所有这些问题的解决方案是删除f
或df
的声明,然后通过更正代码以使用剩余的text
来修复您获得的编译器错误变量。 (这里有两个重要的经验教训
您的循环也无效,因为您正在使用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
。)
最后但并非最不重要的是,学习正确格式化代码。它使调试和维护变得更加容易,并且当您可以清楚地遵循执行路径时,它更容易阅读。