跳轉到內容

Ada 程式設計/庫/Ada.Text_IO

來自華夏公益教科書,開放的書籍,開放的世界

Ada. Time-tested, safe and secure.
Ada. 久經考驗,安全可靠。

此語言特性從 Ada 95 開始可用。

Ada.Text_IO預定義語言環境 中的一個單元,從 Ada 95 開始。

Text_IO 包用於簡單的 輸入輸出 (I/O) 的文字格式。

Text_IO 的提示和技巧

[編輯 | 編輯原始碼]

從控制檯讀取整行

[編輯 | 編輯原始碼]

Ada 2005 有一個函式 Get_Line,它返回一個包含整行的新建字串

function Get_Line return String;

使用舊的 Ada 版本,你需要做一些工作才能用一個呼叫獲取完整的行。Get_Line 過程獲取一行文字,該文字包含 Item 可以容納的字元數,或者直到換行符,以先到者為準。(換行符的表示方式是實現定義的。)它的規範如下:

procedure Get_Line (Item: out String; Last: out Natural);

具體來說,考慮一個可以容納多達 80 個字元的 Item。讓我們讀取兩行,一行少於 80 個字元,比如 10 個,另一行至少 80 個字元,也許更多。呼叫

Get_Line (Item, Last);

將讀取第一行直到換行符,並將它們消耗掉;Item 的前 10 個字元將被填充為讀取的文字,其餘部分是垃圾;Last 將儲存最後一個填充的索引。

下一個呼叫將讀取 Item 可以容納的最大字元數,即 80 個字元;該行的其餘部分(如果有)和換行符將保持未消耗。因此 Last 將為 Item'First - 1 + 80。為了消耗該行的其餘部分,你必須再次呼叫 Get_Line。結果將類似於上述兩種可能性之一,具體取決於剩餘的行的長度。如果沒有讀取任何字元(即當換行符是唯一未讀取的內容時),Last 將儲存值 Item'First - 1

以下示例展示瞭如何讀取完整的行

with Ada.Text_IO;
with Ada.Strings.Unbounded;

function Get_Line return String is

  package Ustr renames Ada.Strings.Unbounded;
  package T_IO renames Ada.Text_IO;

  Everything: Ustr.Unbounded_String := Ustr.Null_Unbounded_String;
  Item      : String (1 .. 80);
  Last      : Natural;

begin

  Get_Whole_Line:
  loop
    T_IO.Get_Line (Item, Last);                                        -- *
    Ustr.Append (Source => Everything, New_Item => Item (1 .. Last));  -- *
    exit Get_Whole_Line when Last < Item'Last;  -- **
  end loop Get_Whole_Line;

  return Ustr.To_String (Everything);

end Get_Line;

作為一個練習,將 (*) 處的呼叫更改為

T_IO.Get_Line (Item (11 .. 20), Last);
Ustr.Append (Source => Everything, New_Item => Item (11 .. Last));

看看 ItemLast 將儲存哪些值。然後,你需要使用什麼標準在 (**) 處退出迴圈?

(當然,這樣編碼不是一個非常明智的主意,但作為學習指導,是可以的。)

從檔案讀取整行

[編輯 | 編輯原始碼]

原則上它與控制檯讀取相同,但你必須檢查檔案是否結束

exit Get_Whole_Line when Last < Item'Last
                      or T_IO.End_Of_File (File);

End_of_File 對於控制檯輸入始終為 False(除非你設法輸入了實現定義的 end_of_file 指示符)。一個格式良好的文字檔案(即使用 Ada.Text_IO 建立的檔案)始終會在 end_of_file 指示符之前包含 end_of_line(和 end_of_page)指示符(參見過程 Close)。


泛型巢狀包

[編輯 | 編輯原始碼]

Ada.Text_IO 包含以下用於 標量型別 的輸入/輸出的巢狀包。唯一引數是所涉及的型別。

  • Decimal_IO
  • Enumeration_IO
  • Fixed_IO
  • Float_IO
  • Integer_IO
  • Modular_IO
--                     Standard Ada library specification
--   Copyright (c) 2003-2018 Maxim Reznik <reznikmm@gmail.com>
--   Copyright (c) 2004-2016 AXE Consultants
--   Copyright (c) 2004, 2005, 2006 Ada-Europe
--   Copyright (c) 2000 The MITRE Corporation, Inc.
--   Copyright (c) 1992, 1993, 1994, 1995 Intermetrics, Inc.
--   SPDX-License-Identifier: BSD-3-Clause and LicenseRef-AdaReferenceManual
-- -------------------------------------------------------------------------

with Ada.IO_Exceptions;

package Ada.Text_IO is

   type File_Type is limited private;

   type File_Mode is (In_File, Out_File, Append_File);

   type Count is range 0 .. implementation_defined;
   subtype Positive_Count is Count range 1 .. Count'Last;
   Unbounded : constant Count := 0; --  line and page length

   subtype Field       is Integer range 0 .. implementation_defined;
   subtype Number_Base is Integer range 2 .. 16;

   type Type_Set is (Lower_Case, Upper_Case);

   --  File Management

   procedure Create (File : in out File_Type;
                     Mode : in File_Mode := Out_File;
                     Name : in String    := "";
                     Form : in String    := "");

   procedure Open   (File : in out File_Type;
                     Mode : in File_Mode;
                     Name : in String;
                     Form : in String := "");

   procedure Close  (File : in out File_Type);
   procedure Delete (File : in out File_Type);
   procedure Reset  (File : in out File_Type; Mode : in File_Mode);
   procedure Reset  (File : in out File_Type);

   function  Mode   (File : in File_Type) return File_Mode;
   function  Name   (File : in File_Type) return String;
   function  Form   (File : in File_Type) return String;

   function  Is_Open(File : in File_Type) return Boolean;

   --  Control of default input and output files

   procedure Set_Input (File : in File_Type);
   procedure Set_Output(File : in File_Type);
   procedure Set_Error (File : in File_Type);

   function Standard_Input  return File_Type;
   function Standard_Output return File_Type;
   function Standard_Error  return File_Type;

   function Current_Input   return File_Type;
   function Current_Output  return File_Type;
   function Current_Error   return File_Type;

   type File_Access is access constant File_Type;

   function Standard_Input  return File_Access;
   function Standard_Output return File_Access;
   function Standard_Error  return File_Access;

   function Current_Input   return File_Access;
   function Current_Output  return File_Access;
   function Current_Error   return File_Access;

   --   Buffer control
   procedure Flush (File : in out File_Type);
   procedure Flush;

   --  Specification of line and page lengths

   procedure Set_Line_Length (File : in File_Type; To : in Count);
   procedure Set_Line_Length (To   : in Count);

   procedure Set_Page_Length (File : in File_Type; To : in Count);
   procedure Set_Page_Length (To   : in Count);

   function  Line_Length (File : in File_Type) return Count;
   function  Line_Length return Count;

   function  Page_Length (File : in File_Type) return Count;
   function  Page_Length return Count;

   --  Column, Line, and Page Control

   procedure New_Line   (File    : in File_Type;
                         Spacing : in Positive_Count := 1);
   procedure New_Line   (Spacing : in Positive_Count := 1);

   procedure Skip_Line  (File    : in File_Type;
                         Spacing : in Positive_Count := 1);
   procedure Skip_Line  (Spacing : in Positive_Count := 1);

   function  End_Of_Line (File : in File_Type) return Boolean;
   function  End_Of_Line return Boolean;

   procedure New_Page   (File : in File_Type);
   procedure New_Page;

   procedure Skip_Page  (File : in File_Type);
   procedure Skip_Page;

   function  End_Of_Page (File : in File_Type) return Boolean;
   function  End_Of_Page return Boolean;

   function  End_Of_File (File : in File_Type) return Boolean;
   function  End_Of_File return Boolean;

   procedure Set_Col (File : in File_Type; To : in Positive_Count);
   procedure Set_Col (To   : in Positive_Count);

   procedure Set_Line (File : in File_Type; To : in Positive_Count);
   procedure Set_Line (To   : in Positive_Count);

   function Col (File : in File_Type) return Positive_Count;
   function Col  return Positive_Count;

   function Line (File : in File_Type) return Positive_Count;
   function Line return Positive_Count;

   function Page (File : in File_Type) return Positive_Count;
   function Page return Positive_Count;

   --  Character Input-Output

   procedure Get (File : in  File_Type; Item : out Character);
   procedure Get (Item : out Character);

   procedure Put (File : in  File_Type; Item : in Character);
   procedure Put (Item : in  Character);

   procedure Look_Ahead (File        : in  File_Type;
                         Item        : out Character;
                         End_Of_Line : out Boolean);
   procedure Look_Ahead (Item        : out Character;
                         End_Of_Line : out Boolean);

   procedure Get_Immediate (File      : in  File_Type;
                            Item      : out Character);
   procedure Get_Immediate (Item      : out Character);

   procedure Get_Immediate (File      : in  File_Type;
                            Item      : out Character;
                            Available : out Boolean);
   procedure Get_Immediate (Item      : out Character;
                            Available : out Boolean);

   --  String Input-Output

   procedure Get (File : in  File_Type; Item : out String);
   procedure Get (Item : out String);

   procedure Put (File : in  File_Type; Item : in String);
   procedure Put (Item : in  String);

   procedure Get_Line (File : in  File_Type;
                       Item : out String;
                       Last : out Natural);
   procedure Get_Line (Item : out String; Last : out Natural);

   function Get_Line(File : in  File_Type) return String;

   function Get_Line return String;

   procedure Put_Line (File : in  File_Type; Item : in String);
   procedure Put_Line (Item : in  String);

   --  Generic packages for Input-Output of Integer Types

   generic
      type Num is range <>;
   package Integer_IO is

      Default_Width : Field := Num'Width;
      Default_Base  : Number_Base := 10;

      procedure Get (File  : in  File_Type;
                     Item  : out Num;
                     Width : in Field := 0);
      procedure Get (Item  : out Num;
                     Width : in  Field := 0);

      procedure Put (File  : in File_Type;
                     Item  : in Num;
                     Width : in Field := Default_Width;
                     Base  : in Number_Base := Default_Base);
      procedure Put (Item  : in Num;
                     Width : in Field := Default_Width;
                     Base  : in Number_Base := Default_Base);
      procedure Get (From : in  String;
                     Item : out Num;
                     Last : out Positive);
      procedure Put (To   : out String;
                     Item : in Num;
                     Base : in Number_Base := Default_Base);

   end Integer_IO;

   generic
      type Num is mod <>;
   package Modular_IO is

      Default_Width : Field := Num'Width;
      Default_Base  : Number_Base := 10;

      procedure Get (File  : in  File_Type;
                     Item  : out Num;
                     Width : in Field := 0);
      procedure Get (Item  : out Num;
                     Width : in  Field := 0);

      procedure Put (File  : in File_Type;
                     Item  : in Num;
                     Width : in Field := Default_Width;
                     Base  : in Number_Base := Default_Base);
      procedure Put (Item  : in Num;
                     Width : in Field := Default_Width;
                     Base  : in Number_Base := Default_Base);
      procedure Get (From : in  String;
                     Item : out Num;
                     Last : out Positive);
      procedure Put (To   : out String;
                     Item : in Num;
                     Base : in Number_Base := Default_Base);

   end Modular_IO;

   --  Generic packages for Input-Output of Real Types

   generic
      type Num is digits <>;
   package Float_IO is

      Default_Fore : Field := 2;
      Default_Aft  : Field := Num'Digits-1;
      Default_Exp  : Field := 3;

      procedure Get (File  : in  File_Type;
                     Item  : out Num;
                     Width : in  Field := 0);
      procedure Get (Item  : out Num;
                     Width : in  Field := 0);

      procedure Put (File : in File_Type;
                     Item : in Num;
                     Fore : in Field := Default_Fore;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);
      procedure Put (Item : in Num;
                     Fore : in Field := Default_Fore;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);

      procedure Get (From : in String;
                     Item : out Num;
                     Last : out Positive);
      procedure Put (To   : out String;
                     Item : in Num;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);
   end Float_IO;

   generic
      type Num is delta <>;
   package Fixed_IO is

      Default_Fore : Field := Num'Fore;
      Default_Aft  : Field := Num'Aft;
      Default_Exp  : Field := 0;

      procedure Get (File  : in  File_Type;
                     Item  : out Num;
                     Width : in  Field := 0);
      procedure Get (Item  : out Num;
                     Width : in  Field := 0);

      procedure Put (File : in File_Type;
                     Item : in Num;
                     Fore : in Field := Default_Fore;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);
      procedure Put (Item : in Num;
                     Fore : in Field := Default_Fore;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);

      procedure Get (From : in  String;
                     Item : out Num;
                     Last : out Positive);
      procedure Put (To   : out String;
                     Item : in Num;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);
   end Fixed_IO;

   generic
      type Num is delta <> digits <>;
   package Decimal_IO is

      Default_Fore : Field := Num'Fore;
      Default_Aft  : Field := Num'Aft;
      Default_Exp  : Field := 0;

      procedure Get (File  : in  File_Type;
                     Item  : out Num;
                     Width : in  Field := 0);
      procedure Get (Item  : out Num;
                     Width : in  Field := 0);

      procedure Put (File : in File_Type;
                     Item : in Num;
                     Fore : in Field := Default_Fore;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);
      procedure Put (Item : in Num;
                     Fore : in Field := Default_Fore;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);

      procedure Get (From : in  String;
                     Item : out Num;
                     Last : out Positive);
      procedure Put (To   : out String;
                     Item : in Num;
                     Aft  : in Field := Default_Aft;
                     Exp  : in Field := Default_Exp);
   end Decimal_IO;

   --  Generic package for Input-Output of Enumeration Types

   generic
      type Enum is (<>);
   package Enumeration_IO is

      Default_Width   : Field := 0;
      Default_Setting : Type_Set := Upper_Case;

      procedure Get (File : in  File_Type;
                     Item : out Enum);
      procedure Get (Item : out Enum);

      procedure Put (File  : in File_Type;
                     Item  : in Enum;
                     Width : in Field    := Default_Width;
                     Set   : in Type_Set := Default_Setting);
      procedure Put (Item  : in Enum;
                     Width : in Field    := Default_Width;
                     Set   : in Type_Set := Default_Setting);

      procedure Get (From : in  String;
                     Item : out Enum;
                     Last : out Positive);
      procedure Put (To   : out String;
                     Item : in  Enum;
                     Set  : in  Type_Set := Default_Setting);
   end Enumeration_IO;

   --  Exceptions

   Status_Error : exception renames IO_Exceptions.Status_Error;
   Mode_Error   : exception renames IO_Exceptions.Mode_Error;
   Name_Error   : exception renames IO_Exceptions.Name_Error;
   Use_Error    : exception renames IO_Exceptions.Use_Error;
   Device_Error : exception renames IO_Exceptions.Device_Error;
   End_Error    : exception renames IO_Exceptions.End_Error;
   Data_Error   : exception renames IO_Exceptions.Data_Error;
   Layout_Error : exception renames IO_Exceptions.Layout_Error;

private

   type File_Type is limited null record;

end Ada.Text_IO;

華夏公益教科書

[編輯 | 編輯原始碼]

外部示例

[編輯原始碼]

Ada 參考手冊

[編輯 | 編輯原始碼]

Ada 質量和風格指南

[編輯 | 編輯原始碼]

開源實現

[編輯 | 編輯原始碼]

FSF GNAT

drake

華夏公益教科書