用Pascal将记录从文本文件读入数组

用Pascal将记录从文本文件读入数组,pascal,freepascal,Pascal,Freepascal,1.这是我的代码我想在pascal中将一条记录从文本文件读入数组我的程序是关于制作一个酒店助手的,我已经有一个包含酒店数据的文本文件,然后我应该从文本文件中读取它并将其存储在数组中。。但我面临错误103退出代码文件未打开。。。。请帮忙 程序Hotel1输入、输出; 在var块中声明了两个Text类型的变量df和f 您可以使用以下行打开df: assign(df,filename); reset(df); 然后从f中读取,该文件不是您在上面打开的文件,分为几行,例如: Read (f, num)

1.这是我的代码我想在pascal中将一条记录从文本文件读入数组我的程序是关于制作一个酒店助手的,我已经有一个包含酒店数据的文本文件,然后我应该从文本文件中读取它并将其存储在数组中。。但我面临错误103退出代码文件未打开。。。。请帮忙

程序Hotel1输入、输出;
在var块中声明了两个Text类型的变量df和f

您可以使用以下行打开df:

assign(df,filename);
reset(df);
然后从f中读取,该文件不是您在上面打开的文件,分为几行,例如:

Read (f, num);
有趣的是,您实际上成功地关闭了真正打开的文件,即使您从未在循环中使用它:

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

只声明您实际需要的变量。 使用您声明的变量。 您的循环也是无效的,因为您正在使用while而不是eof,并且没有为其提供测试结束的文件。循环应该读取,而不是执行Eofdf

遵循以T为前缀的典型命名约定也更好。它清楚地表明它是一个类型而不是一个变量,并允许您更轻松地阅读代码。例如,我将您的数据定义更改为TRoomData,并相应地更改其他类型声明。下面是一个示例-请注意,TRoomData现在有一个名为Room的字段成员,类型为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;
尽管如此,您的文件并不包含文本,因此您首先使用df:text是在使用错误的文件类型。您应该使用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


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

在主程序中,我只是调用了read_DataLoong Time,因为我这样做了,但它不应该读取作为第一个参数的df,这是您的文件。感谢您的建议@KenWhite,我将尝试遵循它。。。。但是我声明'DF'为文本而不是'file of text',所以我把它放在硬盘上,我用文本编辑器记事本编辑文件,我的意思是我不必把数据放在我的文件中,数据已经存在于文件中,所以我应该从文件中读取RoomData并将其存储在数组中,以便在我的程序中使用。。。。我的pascal版本不支持这一点,我必须使用DF:text,我希望我可以用二进制文件来实现这一点,这会更容易,但我有义务使用textWell,我的答案的前9或10段将向您解释如何修复代码来实现这一点,如果您必须这样做的话。
// 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;