Ada 程式設計/輸入輸出
標準 Ada 庫提供了多種輸入/輸出功能,每種功能都適應於特定的需求。具體來說,該語言定義了以下專用包
- Text_IO
- Sequential_IO
- Direct_IO
- Stream_IO
程式設計師必須根據應用程式需求選擇合適的包。例如,應該考慮應用程式處理的資料的以下屬性
- 資料內容:純文字還是二進位制資料?
- 訪問資料:隨機訪問還是順序訪問?
- 介質:資料檔案、控制檯、網路/資料匯流排?
- 資料結構:同構檔案(相同資料欄位的序列),異構檔案(不同的資料欄位)?
- 資料格式:是否符合現有的資料格式,或者應用程式可以自由選擇新的格式?
例如,Stream_IO 功能強大,可以處理複雜的資料結構,但可能比其他包更重;Sequential_IO 輕巧易用,但不能被需要隨機資料訪問的應用程式使用;Text_IO 只能處理文字資料,但足以處理命令列控制檯。
下表提供了一些關於如何選擇最合適的包的建議
| 資料訪問 | 純文字 | 二進位制資料 | |
|---|---|---|---|
| 同構 | 異構 | ||
| 順序 | Text_IO | Sequential_IO | Stream_IO |
| 隨機 | Stream_IO | Direct_IO | Stream_IO |
因此,最重要的教訓是要選擇正確的包。本章將更詳細地描述這些標準包,解釋如何有效地使用它們。除了這些 Ada 定義的一般 I/O 操作包外,每個 Ada 編譯器通常都有其他實現定義的輸入輸出功能,還有其他 用於專門 I/O 需求的外部庫,例如 XML 處理或與資料庫介面。
文字 I/O 可能是最常用的輸入輸出包。檔案中的所有資料都以人類可讀的文字形式表示。文字 I/O 提供對行和頁面佈局的支援,但標準是自由格式文字。
withAda.Text_IO;procedureMainisStr : String (1 .. 80); Last : Natural;beginAda.Text_IO.Get_Line (Str, Last); Ada.Text_IO.Put_Line (Str (1 .. Last));end;
此示例將文字從標準輸入複製到標準輸出,前提是所有行都小於 80 個字元(字串長度)。請參見包 文字 I/O 如何處理更長的行。
該包還包含幾個用於將數值和列舉型別轉換為字元字串的泛型包;有用於處理有界和無界字串的子包,允許程式設計師輕鬆地在同一個檔案中讀取和寫入不同的資料型別(對於 Integer、Float 和 Complex 型別,這些泛型包有一些現成的例項)。最後,針對型別 Wide_Character 和 Wide_Wide_Character 的相同 Ada.Text_IO 包族(包括幾個子包和例項化包)。
值得注意的是,Text_IO 包族提供了一些自動文字處理。例如,數值和列舉型別的 Get 過程會忽略一行開頭的空格(String 的 Get_Line 沒有這種行為),或者在關閉檔案時新增行和頁面終止符。因此,這適用於處理簡單文字資料的應用程式,但需要直接管理文字(例如,對字元編碼的原始訪問)的使用者必須考慮其他包,例如 Sequential_IO。
請參見 本教程,以獲取在 Ada 中使用文字 I/O 的更長示例。
直接 I/O 用於隨機訪問檔案,這些檔案只包含一種特定型別元素。使用 Direct_IO,您可以將檔案指標定位到該型別的任何元素(隨機訪問),但是您不能隨意選擇元素型別,元素型別必須是 確定的子型別。
直接 I/O 用於隨機訪問檔案,這些檔案只包含一種特定型別元素。使用 Sequential_IO,情況正好相反:您可以選擇 確定 和 不確定 元素型別,但是您必須一個接一個地讀取和寫入元素。
流式 I/O 是 Ada 提供的最強大的輸入輸出包。流式 I/O 允許您在一個順序檔案中混合來自不同元素型別的物件。為了從流中讀取/寫入,每個型別都提供了一個 'Read 和 'Write 屬性,以及一個 'Input 和 'Output 屬性。這些屬性是為您宣告的每個型別自動生成的。
'Read 和 'Write 屬性將元素視為原始資料。它們適合於低階輸入/輸出,以及與其他程式語言的介面。
'Input 和 'Output 屬性會向檔案新增額外的控制資訊,例如,陣列的 'First 和 'Last 屬性。
在面向物件的程式設計中,您還可以使用 'Class'Input 和 'Class'Output 屬性 - 它們將儲存和恢復實際的物件型別。
流式 I/O 也是最靈活的輸入輸出包。所有 I/O 屬性都可以使用表示子句替換為使用者定義的函式或過程,您可以使用靈活的面向物件技術提供您自己的流式 I/O 型別。
- Ada 程式設計
- Ada 程式設計/庫/Ada.Direct_IO
- Ada 程式設計/庫/Ada.Sequential_IO
- Ada 程式設計/庫/Ada.Streams
- Ada 程式設計/庫/Ada.Text_IO
- Ada 程式設計/庫/Ada.Text_IO.Enumeration_IO(巢狀包)
- Ada 程式設計/庫/Ada.Text_IO.Integer_IO(巢狀包)
- Ada 程式設計/庫/Ada.Text_IO.Modular_IO(巢狀包)
- Ada 程式設計/庫/Ada.Text_IO.Float_IO(巢狀包)
- Ada 程式設計/庫/Ada.Text_IO.Fixed_IO(巢狀包)
- Ada 程式設計/庫/Ada.Text_IO.Decimal_IO(巢狀包)
- Ada 程式設計/庫/Ada.Text_IO.Bounded_IO
- Ada 程式設計/庫/Ada.Text_IO.Unbounded_IO
- Ada 程式設計/庫/Ada.Text_IO.Complex_IO(專門需求附件)
- Ada 程式設計/庫/Ada.Text_IO.Editing(專門需求附件)
- Ada 程式設計/庫/Ada.Integer_Text_IO
- Ada 程式設計/庫/Ada.Float_Text_IO
- Ada 程式設計/庫/Ada.Complex_Text_IO(專門需求附件)
- Ada 程式設計/庫/Ada.Storage_IO(不是通用 I/O 包)
- Ada 程式設計/庫/Ada.IO_Exceptions
- Ada 程式設計/庫/Ada.Command_Line
- Ada 程式設計/庫/Ada.Directories
- Ada 程式設計/庫/Ada.Environment_Variables
- Ada 程式設計/庫/GNAT.IO(實現定義)
- Ada 程式設計/庫/GNAT.IO_Aux(實現定義)
- Ada 程式設計/庫/GNAT.Calendar.Time_IO (實現定義)
- Ada 程式設計/庫/System.IO (實現定義)
- Ada 程式設計/庫
- Ada 程式設計/平臺
- Ada 程式設計/平臺/Linux
- Ada 程式設計/平臺/Windows
