Ada 程式設計/庫/Ada.Text_IO
此語言功能從 Ada 95 開始可用。
Ada.Text_IO 是自 Ada 95 以來 預定義語言環境 的一個單元。
Text_IO 包用於簡單的 輸入輸出 (I/O)(文字格式)。
Ada 2005 有一個 Get_Line 函式,它返回一個包含整行的全新字串
functionGet_LinereturnString;
對於舊版本的 Ada,您需要進行一些工作才能透過一次呼叫獲取完整行。Get_Line 過程獲取一行文字,文字長度可以是 Item 可以容納的字元數,也可以是到換行符指示符的長度,以先到者為準。(換行符指示符的表示方式是實現定義的。)它具有以下規範
procedureGet_Line (Item:outString; Last:outNatural);
具體來說,假設 Item 可以容納多達 80 個字元。我們讀取兩行,第一行少於 80 個字元,例如 10 個,第二行至少 80 個字元,也許更多。呼叫
Get_Line (Item, Last);
將讀取第一行到換行符指示符並消耗它們;Item 的前 10 個字元將填充讀取的文字,其餘為垃圾資料;Last 將儲存最後填充的索引。
下一次呼叫將讀取 Item 可以容納的最大字元數,即 80 個字元;行中剩餘的字元(如果有)和換行符指示符將保持未消耗。因此 Last 將為 Item'First - 1 + 80。為了消耗行中剩餘的字元,您必須再次呼叫 Get_Line。結果將類似於上述兩種情況之一,具體取決於剩餘的行長。如果未讀取任何字元(即當換行符指示符是唯一未讀內容時),Last 將儲存值 Item'First - 1。
以下示例顯示如何讀取完整行
withAda.Text_IO;withAda.Strings.Unbounded;functionGet_LinereturnStringispackageUstrrenamesAda.Strings.Unbounded;packageT_IOrenamesAda.Text_IO; Everything: Ustr.Unbounded_String := Ustr.Null_Unbounded_String; Item : String (1 .. 80); Last : Natural;beginGet_Whole_Line:loopT_IO.Get_Line (Item, Last); -- * Ustr.Append (Source => Everything, New_Item => Item (1 .. Last)); -- *exitGet_Whole_LinewhenLast < Item'Last; -- **endloopGet_Whole_Line;returnUstr.To_String (Everything);endGet_Line;
作為練習,將 (*) 處的呼叫更改為
T_IO.Get_Line (Item (11 .. 20), Last); Ustr.Append (Source => Everything, New_Item => Item (11 .. Last));
並檢視 Item 和 Last 將儲存哪些值。然後,您需要使用哪個標準退出迴圈 (**)?
(當然,這樣寫程式碼不是一個好主意,但作為學習指令,它可以。
原則上與控制檯讀取相同,但您還必須檢查檔案結尾
exitGet_Whole_LinewhenLast < Item'LastorT_IO.End_Of_File (File);
對於控制檯輸入,End_of_File 始終為 False(除非您設法輸入了實現定義的檔案結尾指示符)。格式正確的文字檔案(即使用 Ada.Text_IO 建立的檔案)始終會在檔案結尾指示符之前儲存一個行結尾(以及一個頁面結尾)指示符(請參閱過程 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 -- -------------------------------------------------------------------------withAda.IO_Exceptions;packageAda.Text_IOistypeFile_Typeislimitedprivate;typeFile_Modeis(In_File, Out_File, Append_File);typeCountisrange0 .. implementation_defined;subtypePositive_CountisCountrange1 .. Count'Last; Unbounded :constantCount := 0; -- line and page lengthsubtypeFieldisIntegerrange0 .. implementation_defined;subtypeNumber_BaseisIntegerrange2 .. 16;typeType_Setis(Lower_Case, Upper_Case); -- File ManagementprocedureCreate (File :inoutFile_Type; Mode :inFile_Mode := Out_File; Name :inString := ""; Form :inString := "");procedureOpen (File :inoutFile_Type; Mode :inFile_Mode; Name :inString; Form :inString := "");procedureClose (File :inoutFile_Type);procedureDelete (File :inoutFile_Type);procedureReset (File :inoutFile_Type; Mode :inFile_Mode);procedureReset (File :inoutFile_Type);functionMode (File :inFile_Type)returnFile_Mode;functionName (File :inFile_Type)returnString;functionForm (File :inFile_Type)returnString;functionIs_Open(File :inFile_Type)returnBoolean; -- Control of default input and output filesprocedureSet_Input (File :inFile_Type);procedureSet_Output(File :inFile_Type);procedureSet_Error (File :inFile_Type);functionStandard_InputreturnFile_Type;functionStandard_OutputreturnFile_Type;functionStandard_ErrorreturnFile_Type;functionCurrent_InputreturnFile_Type;functionCurrent_OutputreturnFile_Type;functionCurrent_ErrorreturnFile_Type;typeFile_AccessisaccessconstantFile_Type;functionStandard_InputreturnFile_Access;functionStandard_OutputreturnFile_Access;functionStandard_ErrorreturnFile_Access;functionCurrent_InputreturnFile_Access;functionCurrent_OutputreturnFile_Access;functionCurrent_ErrorreturnFile_Access; -- Buffer controlprocedureFlush (File :inoutFile_Type);procedureFlush; -- Specification of line and page lengthsprocedureSet_Line_Length (File :inFile_Type; To :inCount);procedureSet_Line_Length (To :inCount);procedureSet_Page_Length (File :inFile_Type; To :inCount);procedureSet_Page_Length (To :inCount);functionLine_Length (File :inFile_Type)returnCount;functionLine_LengthreturnCount;functionPage_Length (File :inFile_Type)returnCount;functionPage_LengthreturnCount; -- Column, Line, and Page ControlprocedureNew_Line (File :inFile_Type; Spacing :inPositive_Count := 1);procedureNew_Line (Spacing :inPositive_Count := 1);procedureSkip_Line (File :inFile_Type; Spacing :inPositive_Count := 1);procedureSkip_Line (Spacing :inPositive_Count := 1);functionEnd_Of_Line (File :inFile_Type)returnBoolean;functionEnd_Of_LinereturnBoolean;procedureNew_Page (File :inFile_Type);procedureNew_Page;procedureSkip_Page (File :inFile_Type);procedureSkip_Page;functionEnd_Of_Page (File :inFile_Type)returnBoolean;functionEnd_Of_PagereturnBoolean;functionEnd_Of_File (File :inFile_Type)returnBoolean;functionEnd_Of_FilereturnBoolean;procedureSet_Col (File :inFile_Type; To :inPositive_Count);procedureSet_Col (To :inPositive_Count);procedureSet_Line (File :inFile_Type; To :inPositive_Count);procedureSet_Line (To :inPositive_Count);functionCol (File :inFile_Type)returnPositive_Count;functionColreturnPositive_Count;functionLine (File :inFile_Type)returnPositive_Count;functionLinereturnPositive_Count;functionPage (File :inFile_Type)returnPositive_Count;functionPagereturnPositive_Count; -- Character Input-OutputprocedureGet (File :inFile_Type; Item :outCharacter);procedureGet (Item :outCharacter);procedurePut (File :inFile_Type; Item :inCharacter);procedurePut (Item :inCharacter);procedureLook_Ahead (File :inFile_Type; Item :outCharacter; End_Of_Line :outBoolean);procedureLook_Ahead (Item :outCharacter; End_Of_Line :outBoolean);procedureGet_Immediate (File :inFile_Type; Item :outCharacter);procedureGet_Immediate (Item :outCharacter);procedureGet_Immediate (File :inFile_Type; Item :outCharacter; Available :outBoolean);procedureGet_Immediate (Item :outCharacter; Available :outBoolean); -- String Input-OutputprocedureGet (File :inFile_Type; Item :outString);procedureGet (Item :outString);procedurePut (File :inFile_Type; Item :inString);procedurePut (Item :inString);procedureGet_Line (File :inFile_Type; Item :outString; Last :outNatural);procedureGet_Line (Item :outString; Last :outNatural);functionGet_Line(File :inFile_Type)returnString;functionGet_LinereturnString;procedurePut_Line (File :inFile_Type; Item :inString);procedurePut_Line (Item :inString); -- Generic packages for Input-Output of Integer TypesgenerictypeNumisrange<>;packageInteger_IOisDefault_Width : Field := Num'Width; Default_Base : Number_Base := 10;procedureGet (File :inFile_Type; Item :outNum; Width :inField := 0);procedureGet (Item :outNum; Width :inField := 0);procedurePut (File :inFile_Type; Item :inNum; Width :inField := Default_Width; Base :inNumber_Base := Default_Base);procedurePut (Item :inNum; Width :inField := Default_Width; Base :inNumber_Base := Default_Base);procedureGet (From :inString; Item :outNum; Last :outPositive);procedurePut (To :outString; Item :inNum; Base :inNumber_Base := Default_Base);endInteger_IO;generictypeNumismod<>;packageModular_IOisDefault_Width : Field := Num'Width; Default_Base : Number_Base := 10;procedureGet (File :inFile_Type; Item :outNum; Width :inField := 0);procedureGet (Item :outNum; Width :inField := 0);procedurePut (File :inFile_Type; Item :inNum; Width :inField := Default_Width; Base :inNumber_Base := Default_Base);procedurePut (Item :inNum; Width :inField := Default_Width; Base :inNumber_Base := Default_Base);procedureGet (From :inString; Item :outNum; Last :outPositive);procedurePut (To :outString; Item :inNum; Base :inNumber_Base := Default_Base);endModular_IO; -- Generic packages for Input-Output of Real TypesgenerictypeNumisdigits<>;packageFloat_IOisDefault_Fore : Field := 2; Default_Aft : Field := Num'Digits-1; Default_Exp : Field := 3;procedureGet (File :inFile_Type; Item :outNum; Width :inField := 0);procedureGet (Item :outNum; Width :inField := 0);procedurePut (File :inFile_Type; Item :inNum; Fore :inField := Default_Fore; Aft :inField := Default_Aft; Exp :inField := Default_Exp);procedurePut (Item :inNum; Fore :inField := Default_Fore; Aft :inField := Default_Aft; Exp :inField := Default_Exp);procedureGet (From :inString; Item :outNum; Last :outPositive);procedurePut (To :outString; Item :inNum; Aft :inField := Default_Aft; Exp :inField := Default_Exp);endFloat_IO;generictypeNumisdelta<>;packageFixed_IOisDefault_Fore : Field := Num'Fore; Default_Aft : Field := Num'Aft; Default_Exp : Field := 0;procedureGet (File :inFile_Type; Item :outNum; Width :inField := 0);procedureGet (Item :outNum; Width :inField := 0);procedurePut (File :inFile_Type; Item :inNum; Fore :inField := Default_Fore; Aft :inField := Default_Aft; Exp :inField := Default_Exp);procedurePut (Item :inNum; Fore :inField := Default_Fore; Aft :inField := Default_Aft; Exp :inField := Default_Exp);procedureGet (From :inString; Item :outNum; Last :outPositive);procedurePut (To :outString; Item :inNum; Aft :inField := Default_Aft; Exp :inField := Default_Exp);endFixed_IO;generictypeNumisdelta<>digits<>;packageDecimal_IOisDefault_Fore : Field := Num'Fore; Default_Aft : Field := Num'Aft; Default_Exp : Field := 0;procedureGet (File :inFile_Type; Item :outNum; Width :inField := 0);procedureGet (Item :outNum; Width :inField := 0);procedurePut (File :inFile_Type; Item :inNum; Fore :inField := Default_Fore; Aft :inField := Default_Aft; Exp :inField := Default_Exp);procedurePut (Item :inNum; Fore :inField := Default_Fore; Aft :inField := Default_Aft; Exp :inField := Default_Exp);procedureGet (From :inString; Item :outNum; Last :outPositive);procedurePut (To :outString; Item :inNum; Aft :inField := Default_Aft; Exp :inField := Default_Exp);endDecimal_IO; -- Generic package for Input-Output of Enumeration TypesgenerictypeEnumis(<>);packageEnumeration_IOisDefault_Width : Field := 0; Default_Setting : Type_Set := Upper_Case;procedureGet (File :inFile_Type; Item :outEnum);procedureGet (Item :outEnum);procedurePut (File :inFile_Type; Item :inEnum; Width :inField := Default_Width; Set :inType_Set := Default_Setting);procedurePut (Item :inEnum; Width :inField := Default_Width; Set :inType_Set := Default_Setting);procedureGet (From :inString; Item :outEnum; Last :outPositive);procedurePut (To :outString; Item :inEnum; Set :inType_Set := Default_Setting);endEnumeration_IO; -- Exceptions Status_Error :exceptionrenamesIO_Exceptions.Status_Error; Mode_Error :exceptionrenamesIO_Exceptions.Mode_Error; Name_Error :exceptionrenamesIO_Exceptions.Name_Error; Use_Error :exceptionrenamesIO_Exceptions.Use_Error; Device_Error :exceptionrenamesIO_Exceptions.Device_Error; End_Error :exceptionrenamesIO_Exceptions.End_Error; Data_Error :exceptionrenamesIO_Exceptions.Data_Error; Layout_Error :exceptionrenamesIO_Exceptions.Layout_Error;privatetypeFile_Typeislimitednullrecord;endAda.Text_IO;
外部示例
[編輯原始碼]- 搜尋
Ada.Text_IO的示例:Rosetta Code、GitHub (gists)、任何 Alire 包 或 本華夏公益教科書。 - 搜尋與
Ada.Text_IO相關的帖子:Stack Overflow、comp.lang.ada 或 任何與 Ada 相關的頁面。
FSF GNAT
- 規格說明:a-textio.ads
- 主體:a-textio.adb
drake
