跳转到内容

Ada 编程/输入输出

来自维基教科书,自由的教科书

Ada. Time-tested, safe and secure.
Ada. 经得起时间考验,安全可靠。

标准 Ada 库提供了多种输入/输出功能,每种功能都适应于特定的需求。具体来说,该语言定义了以下专用包

  • Text_IO
  • Sequential_IO
  • Direct_IO
  • Stream_IO

程序员必须根据应用程序需求选择合适的包。例如,应该考虑应用程序处理的数据的以下属性

  • 数据内容:纯文本还是二进制数据?
  • 访问数据:随机访问还是顺序访问?
  • 介质:数据文件、控制台、网络/数据总线?
  • 数据结构:同构文件(相同数据字段的序列),异构文件(不同的数据字段)?
  • 数据格式:是否符合现有的数据格式,或者应用程序可以自由选择新的格式?

例如,Stream_IO 功能强大,可以处理复杂的数据结构,但可能比其他包更重;Sequential_IO 轻巧易用,但不能被需要随机数据访问的应用程序使用;Text_IO 只能处理文本数据,但足以处理命令行控制台。


下表提供了一些关于如何选择最合适的包的建议

选择 I/O 包的简单启发式方法
数据访问 纯文本 二进制数据
同构 异构
顺序 Text_IO Sequential_IO Stream_IO
随机 Stream_IO Direct_IO Stream_IO

因此,最重要的教训是要选择正确的包。本章将更详细地描述这些标准包,解释如何有效地使用它们。除了这些 Ada 定义的一般 I/O 操作包外,每个 Ada 编译器通常都有其他实现定义的输入输出功能,还有其他 用于专门 I/O 需求的外部库,例如 XML 处理或与数据库接口。

文本 I/O

[编辑 | 编辑源代码]

文本 I/O 可能是最常用的输入输出包。文件中的所有数据都以人类可读的文本形式表示。文本 I/O 提供对行和页面布局的支持,但标准是自由格式文本。

with Ada.Text_IO;
 
procedure Main is
  Str  : String (1 .. 80);
  Last : Natural;
begin
  Ada.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

[编辑 | 编辑源代码]

直接 I/O 用于随机访问文件,这些文件只包含一种特定类型元素。使用 Direct_IO,您可以将文件指针定位到该类型的任何元素(随机访问),但是您不能随意选择元素类型,元素类型必须是 确定的子类型

顺序 I/O

[编辑 | 编辑源代码]

直接 I/O 用于随机访问文件,这些文件只包含一种特定类型元素。使用 Sequential_IO,情况正好相反:您可以选择 确定不确定 元素类型,但是您必须一个接一个地读取和写入元素。

流式 I/O

[编辑 | 编辑源代码]

流式 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 95 质量和风格指南

[编辑 | 编辑源代码]
华夏公益教科书