Ada:在读取文件时在单独的过程中添加例外

时间:2012-03-20 20:34:01

标签: file exception ada

这是对此问题的跟进: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

如何解决这个问题?

非常感谢...

更新

我现在做了以下更正。

  1. actual for "File" must be a variable 中,我现在有test_read.adb

  2. 更新了procedure Open_Data (File : in out Ada.Text_IO.File_Type; Name : in String) is separate;中相同Open_Data程序的定义

  3. 如果我将文件test_read-open_data.adb重命名为fx.txt,我认为没有看到异常,程序编译得很好。我得到的错误消息只是

    fy.txt

    所以我没有得到自己的错误消息:找不到文件

    还有什么问题?

4 个答案:

答案 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的输出。