1.这是我的代码,我想从文本文件中读取记录到帕斯卡中的数组中,我的程序是关于制作酒店帮手的,我已经有一个包含酒店数据的文本文件,那么我应该从文本文件中读取它并将其存储在数组中..但是我正面临错误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}
您已在代码块中声明了两个类型为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
type的字段(成员)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
。)
最后但并非最不重要的一点是,学习正确格式化代码。它使调试和维护变得更加容易,并且当您可以清楚地遵循执行路径时,它也使阅读变得更加容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句