这是对此问题的跟进:Ada: reading from a file。
我想添加exception
来检查我打开的文件是否确实存在。我已经制定了separate
程序以避免代码混乱。
以下是主要代码test_read.adb
:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Float_Text_IO;
procedure Test_Read is
Input_File : File_Type;
Value : Long_Float;
procedure Open_Data (File : in Ada.Text_IO.File_Type; Name : in String) is separate;
begin
Ada.Text_IO.Open (File => Input_File, Mode => Ada.Text_IO.In_File, Name => "fx.txt");
while not End_Of_File (Input_File) loop
Ada.Long_Float_Text_IO.Get (File => Input_File, Item => Value);
Ada.Long_Float_Text_IO.Put (Item => value, Fore => 3, Aft => 5, Exp => 0);
Ada.Text_IO.New_Line;
end loop;
Ada.Text_IO.Close (File => Input_File);
end Test_Read;
以下是程序separate
的{{1}}正文test_read-open_data.adb
:
Open_Data
在编译时,我在separate(test_read)
procedure Open_Data (File : in out Ada.Text_IO.File_Type;
Name : in String) is
--this procedure prepares a file for reading
begin
begin
Ada.Text_IO.Open
(File => File,
Mode => Ada.Text_IO.In_File,
Name => Name);
exception
when Ada.Text_IO.Name_Error =>
Ada.Text_IO.Put(File => Standard_Error, Item => "File not found.");
end;
end Open_Data;
正文separate
中收到错误消息:
test_read-open_data.adb
如何解决这个问题?
非常感谢...
更新:
我现在做了以下更正。
在actual for "File" must be a variable
中,我现在有test_read.adb
更新了procedure Open_Data (File : in out Ada.Text_IO.File_Type; Name : in String) is separate;
中相同Open_Data
程序的定义。
如果我将文件test_read-open_data.adb
重命名为fx.txt
,我认为没有看到异常,程序编译得很好。我得到的错误消息只是
fy.txt
所以我没有得到自己的错误消息:找不到文件。
还有什么问题?
答案 0 :(得分:3)
Open_Data的File
参数必须是in out
参数(例如,Ada.Text_IO.Create
),因为您希望在Test_Read
内可以访问打开的文件}。
您收到actual for "File" must be a variable
,因为in
参数是只读的。
procedure Open_Data (File : in out Ada.Text_IO.File_Type;
Name : in String) is
(我个人很少输入in
模式,因为这是默认模式。
但无论如何,观察到的行为的原因似乎Test_Read
实际上并没有调用Open_Data
!
(已修改为推荐模式in out
&建议致电Open_Data
)
答案 1 :(得分:1)
如果您的目标只是检查文件是否存在,请考虑使用Ada.Directories.Exists
答案 2 :(得分:0)
IIRC:Standard_Error不是文件,而是Stream。
答案 3 :(得分:0)
我怀疑您没有看到错误消息的原因是您使用的是Put而不是Put_Line。不同的实现/平台以不同方式将输出视为用户的显示。为了更加确定您将看到该消息,请使用Get_Line跟随Put_Line。 Get_Line通常会强制Put_Line的输出。