开放

用途

OPEN 语句可用于将现有外部文件连接到单元,创建预先连接的外部文件,创建外部文件并将其连接到单元,或者更改外部文件与单元之间的连接的某些说明符。

语法

读取语法图跳过可视语法图OPEN(打开列表)
open_list
列表必须包含一个单位说明符 ([ UNIT=u]) Fortran 2008 开始 或一个 NEWUNIT=说明符 Fortran 2008 结束 。 该列表可以选择性地包含每个其他有效的说明符中的一个。 当列表包含多个说明符时,请使用逗号 (,) 作为分隔符。 有效的说明符如下所示:
[UNIT=] u
是一个单元说明符,其中 u 必须是一个外部单元标识符,其值不能是星号。 外部单元标识符引用由整数表达式表示的外部文件。 整数表达式具有下列其中一个值:如果省略可选字符 UNIT= ,那么 u 必须是 open_list中的第一项。
ACCESS= char_expr
指定文件连接的访问方法。 char_expr 是一个标量字符表达式,当除去任何尾部空格时,其值为 SEQUENTIALDIRECTSTREAM。 如果 ACCESS=DIRECT,那么必须指定 RECL= 如果 ACCESS=STREAM,那么不得指定 RECL=

SEQUENTIAL 是缺省值,对于该缺省值, RECL= 是可选的

ACTION= char_expr
指定允许的输入/输出操作。 char_expr 是一个标量字符表达式,其值求值为 READWRITEREADWRITE。 如果指定了 READ ,那么 WRITEPRINTENDFILE 语句无法引用此连接。 如果指定了 WRITE ,那么 READ 语句无法引用此连接。 值 READWRITE 允许任何输入/输出语句引用此连接。 如果省略了 ACTION= 说明符,那么缺省值取决于实际文件许可权:
  • 如果 STATUS= 说明符具有值 OLDUNKNOWN ,并且该文件已存在:
    • 该文件通过 READWRITE 打开
    • 如果无法执行上述操作,那么将使用 READ 打开该文件
    • 如果以上两种情况都不可能,那么将使用 WRITE打开该文件。
  • 如果 STATUS= 说明符具有值 NEWREPLACESCRATCHUNKNOWN ,并且该文件不存在:
    • 该文件通过 READWRITE 打开
    • 如果无法执行上述操作,那么将使用 WRITE打开该文件。
ASYNCH= char_expr (IBM 扩展)
是一个异步 I/O 说明符,用于指示是否将显式连接的单元用于异步 I/O。

char_expr 是一个标量字符表达式,其值为 YESNOYES 指定此连接允许异步数据传输语句。 NO 指定此连接不允许使用异步数据传输语句。 指定的值将在文件所允许的传输方法集中。 如果省略此说明符,那么缺省值为 NO

预连接单元与 ASYNCH=NO连接。

隐式连接的单元的 ASYNCH= 值由对该单元执行的第一个数据传输语句确定。 如果第一个语句执行异步数据传输,并且正在隐式连接的文件允许异步数据传输,那么 ASYNCH= 值为 YES。 否则, ASYNCH= 值为 NO

ASYNCHRONOUS=char_expr (fortran 2003)
指定单元上是否允许异步 I/O 。

char_expr 是一个标量字符表达式,其值为 YESNO。 如果 char_expr 是允许单元上的值 YES 异步 I/O。 如果 char_expr 是不允许单元上的值 NO 异步 I/O。 如果 ASYNCHRONOUS= 不存在,那么缺省值为 NO

ASYNCH= 说明符 ASYNCHRONOUS= 说明符 不应出现在同一 OPEN 语句中,将忽略第二个说明符。

BLANK= char_expr
控制使用格式规范时空格的缺省解释。 char_expr 是一个标量字符表达式,当除去任何尾部空格时,其值为 NULLZERO。 如果指定了 BLANK= ,那么必须使用 FORM='FORMATTED'。 如果未指定 BLANK= 并且您指定了 FORM='FORMATTED',那么缺省值为 NULL
CONVERT= char_expr
指定对无格式数据文件的 I/O 操作的字节顺序。 char_expr 是一个标量字符表达式,其值必须求值为 NATIVEBIG_ENDIANLITTLE_ENDIAN如果值为 NATIVEBIG_ENDIAN,那么将使用大尾数法字节顺序,并且不需要转换。 如果值为 LITTLE_ENDIAN,那么将在运行时转换数据和记录标记的字节顺序。
您可以通过以下方式指定 I/O 操作的字节顺序。 如果为同一单元指定了多个字节顺序并且这些字节顺序相互冲突,那么列表中第一个出现的字节顺序优先:
  1. 运行时选项 XLFRTEOPTS=ufmt_littleendian
  2. CONVERT= OPEN 语句中的 char_expr ,其中 char_exprNATIVEBIG_ENDIANLITTLE_ENDIAN
  3. @PROCESS UFMT(BE) 或者 @PROCESS UFMT(LE)
  4. 编译器选项 -qufmt=be-qufmt=le
DECIMAL= char_expr (Fortran 2003)
指定对应单元的缺省 十进制编辑方式char_expr 是一个标量字符表达式,其值必须求值为 POINTCOMMA. 如果未指定 DECIMAL= ,那么缺省情况下小数点方式有效。
DELIM= char_expr
指定使用哪些定界符 (如果有) 来定界使用列表定向或名称列表格式编写的字符常量。 char_expr 是一个标量字符表达式,其值必须求值为 APOSTROPHEQUOTENONE。 如果值为 APOSTROPHE,那么将使撇号定界字符常量和字符常量中的所有撇号加倍。 如果值为 QUOTE,那么将对字符常量进行双引号定界,并对字符常量中的所有双引号进行双引号。 如果值为 NONE,那么不会对字符常量进行定界,并且不会将任何字符加倍。 缺省值为 NONEDELIM= 说明符仅允许用于为格式化输入/输出而连接的文件,尽管在格式化记录的输入期间会将其忽略。
ENCODING= char_expr (Fortran 2003)
指定文件的编码格式。 char_expr 是一个标量字符表达式,当除去任何尾部空格时,其值为 DEFAULTENCODING= 说明符必须仅出现在格式化 I/O 语句中。 如果省略,那么缺省值为 DEFAULT
ERR= stmt_label
是一个错误说明符,它指定在同一作用域单元(在发生错误的情况下,控制权将转移到该控制单元)中的可执行语句的语句标号。 对 ERR= 说明符进行编码可禁止错误消息。
FILE= char_expr

是一个文件说明符,它指定要连接到指定单元的文件的名称。

char_expr 是一个标量字符表达式,当除去任何尾部空格时,其值是有效的 AIX® 操作系统文件名 。 如果省略了文件说明符并且是必需的,那么该单元将隐式连接 (缺省情况下) 到 fort.u,其中 u 是在除去任何前导零的情况下指定的单元。 使用 UNIT_VARS 运行时选项来允许将备用文件名用于隐式连接的文件。
注: 有效的 AIX 操作 系统文件名必须具有总长度不超过 1023 个字符的完整路径名,每个文件名长度不超过 255 个字符 (尽管不需要指定完整路径名)。
FORM= char_expr
指定是针对格式化输入/输出还是未格式化输入/输出连接文件。 char_expr 是一个标量字符表达式,当除去任何尾部空格时,其值为 FORMATTEDUNFORMATTED。 如果您连接该文件以进行顺序访问,那么缺省值为 FORMATTED 。 如果连接文件以进行直接访问 或流访问 ,那么缺省值为 UNFORMATTED
IOMSG= iomsg_variable (Fortran 2003)
是输入/输出状态说明符,用于指定输入/输出操作返回的消息。 iomsg_variable 是标量缺省字符变量。 它不能是与用法关联的非指针保护变量。 当包含此说明符的输入/输出语句完成执行时,iomsg_variable 定义如下:
  • 如果发生错误、文件结束或记录结束条件,那么将为变量赋予一条解释性消息,就如同赋值一样。
  • 如果未发生此类情况,那么变量的值将保持不变。
IOSTAT= ios
输入/输出操作的状态的输入/输出状态说明符。 ios 是一个标量整数变量。 当包含此说明符的输入/输出语句完成执行时,ios 定义方式为
  • 如果未发生错误情况,那么值为零
  • 如果发生错误,那么为正值
NEWUNIT= var (Fortran 2008)
输入/输出说明符,用于指定连接的 NEWUNIT 值。 var 是标量缺省整数变量。 NEWUNIT 值是小于 -2 的负数,并且不等于任何当前连接的文件的单元编号。 如果在 OPEN 语句中指定 NEWUNIT= 说明符,那么还必须指定具有值 SCRATCHSTATUS= 说明符或指定 FILE= 说明符。
PAD= char_expr
指定是否使用空白填充输入记录。 char_expr 是必须求值为 YESNO的标量字符表达式。 如果值为 YES,那么如果指定了输入列表,并且格式规范需要来自记录的数据多于记录包含的数据,那么将用空白填充格式化输入记录。 如果指定了 NO ,那么输入列表和格式规范不得要求来自记录的字符多于记录包含的字符。 缺省值为 YES PAD= 说明符仅允许用于为格式化输入/输出而连接的文件,尽管在格式化记录的输出期间将忽略该说明符。

如果 -qxlf77 编译器选项指定 noblankpad 子选项,并且正在为格式化的直接输入/输出连接文件,那么当省略 PAD= 说明符时,缺省值为 NO

POSITION= char_expr
指定为进行顺序访问或流访问而连接的文件的文件位置。 先前不存在的文件位于其初始点。 char_expr 是一个标量字符表达式,当除去任何尾部空格时,其值为 ASISREWINDAPPENDREWIND 将文件定位在其初始点。 APPEND 将该文件放置在结束文件记录之前,如果没有结束文件记录,那么将该文件放置在终端位置。 ASIS 保持位置不变。 除以下情况外,缺省值为 ASIS :
  • 引用 OPEN 语句后的单元的第一个输入/输出语句 ( INQUIRE 语句除外) 是 WRITE 语句,并且:
    • STATUS= 说明符为 UNKNOWN-qposition 编译器选项指定 appendunknown,或者
    • STATUS= 说明符为 OLD-qposition 编译器选项指定 appendold

在此类情况下,执行 WRITE 语句时, POSITION= 说明符的缺省值为 APPEND

RECL= integer_expr

指定为直接访问而连接的文件中每个记录的长度或为顺序访问而连接的文件中记录的最大长度。 integer_expr 是一个整数表达式,其值必须为正数。 如果连接文件以进行直接访问,那么此说明符必须存在。 对于有格式的输入/ 输出,长度是包含字符数据的所有记录的字符数。 对于无格式的输入/输出,长度是数据的内部格式所需的字节数。 无格式的顺序记录长度不计算围绕数据的四字节字段。

IBM 扩展开始

如果在连接文件以进行 32 位顺序访问时省略 RECL= ,那么长度为 2 * *31-1 ,减去记录终止符。 对于 32 位格式化顺序文件,缺省记录长度为 2**31-2。 对于能以 32 位访问的无格式文件,缺省记录长度为 2**31-9。

对于无法以 32 位随机访问的文件,缺省长度为 2**15 (32,768)。

如果在连接文件以进行 64 位顺序访问时省略 RECL= ,那么长度为 2 * *63-1 ,减去记录终止符。 对于 64 位的格式化顺序文件,缺省记录长度为 2 * *63-2 对于 64 位的无格式文件,当 UWIDTH 运行时选项设置为 64 时,缺省记录长度为 2 * *63-17。

IBM 扩展结束
ROUND= char_expr (Fortran 2003)

表示有格式输入和输出的 I/O 舍入方式的当前值。 ROUND= 可由其他语句更改。 如果省略,那么处理器可以选择舍入方式。 char_expr 求值为 UPDOWNZERONEARESTCOMPATIBLEPROCESSOR_DEFINED

舍入方式有助于指定在有格式和输入和输出期间如何将十进制数从字符表示转换为内部表示(即二进制),或者反向转换。 舍入方式具有以下函数:

  • UP 舍入方式下,来自转换的值是大于或等于原始值的最小值。
  • DOWN 舍入方式下,来自转换的值是小于或等于原始值的最大值。
  • ZERO 舍入方式下,来自转换的值是与原始值最接近的值,而不大于量级。
  • NEAREST 舍入方式中,来自转换的值是两个最接近的可表示值中最接近的值。 如果两个值的接近程度相同,那么将选择偶数值。 在 IEEE 舍入转换中,NEAREST 对应于 IEEE 标准所指定的 ieee_nearest 舍入方式。
  • COMPATIBLE 舍入方式下,来自转换的值是两个最接近的可表示值中最接近的值,或者如果中间距离为零,那么值离零更远。
  • PROCESSOR_DEFINED 舍入方式下,来自转换的值依赖于处理器,并且可能对应于其他方式。 在 IBM® Open XL Fortran中, PROCESSOR_DEFINED 舍入方式将是您在浮点控制寄存器中选择的舍入方式。 如果未显式设置浮点控制寄存器,那么缺省舍入方式为 NEAREST
SIGN= char_expr (Fortran 2003)
指示对有格式输入/输出的连接生效的符号方式。 如果为 char_expr 分配了值 PLUS,那么如果为 char_expr 分配了值 SUPPRESS,那么处理器将在通常包含可选加号的任何位置生成加号,并在这些位置中禁止加号。 还可以为 char_expr 指定值 PROCESSOR_DEFINED ,这是缺省符号方式,其作用与 SUPPRESS相同。 如果没有连接,或者如果连接不是用于格式化输入/输出,那么会为 char_expr 分配值 UNDEFINED。 可以在单个数据传输语句中临时更改符号方式。 当语句终止时,符号方式会恢复其先前的值。
STATUS= char_expr
指定文件打开时的状态。 char_expr 是一个标量字符表达式,当除去任何尾部空格时,其值为下列其中一项:
  • OLD,用于将现有文件连接到单元。 如果指定了 OLD ,那么该文件必须存在。 如果该文件不存在,那么将发生错误情况。
  • NEW,要创建新文件,请将其连接到单元,并将状态更改为 OLD。 如果指定了 NEW ,那么该文件不得存在。 如果该文件已存在,那么将发生错误情况。
  • SCRATCH,用于创建和连接将在断开连接时删除的新文件。 SCRATCH 不得与指定的文件一起指定 (即,必须省略 FILE=char_expr )。
  • REPLACE。 如果该文件尚不存在,那么将创建该文件并将状态更改为 OLD。 如果该文件存在,那么将删除该文件,创建同名的新文件,并将状态更改为 OLD
  • UNKNOWN,用于连接现有文件或创建和连接新文件。 如果该文件存在,那么它将作为 OLD进行连接。 如果该文件不存在,那么它将作为 NEW进行连接。

UNKNOWN 是缺省值。

规则

如果某个单元已连接到存在的文件,那么可以对该单元执行 OPEN 语句。 如果 FILE= 说明符未包含在 OPEN 语句中,那么要连接到单元的文件与单元所连接到的文件相同。

Fortran 2008 开始包含 OPENNEWUNIT=说明符的语句成功执行后, NEWUNIT=的变量将赋值一个新的NEWUNIT值。 然而,如果执行语句时发生错误 OPEN语句时出错,则变量 NEWUNIT= 保持其原始值。 Fortran 2008 结束

如果要连接到单元的文件与单元所连接到的文件不同,那么效果就像在执行 OPEN 语句之前对单元执行了不带 STATUS= 说明符的 CLOSE 语句一样。

如果要连接到单元的文件与单元所连接到的文件相同,那么只有 BLANK=DELIM=PAD=ERR=IOSTAT= 说明符可以具有与当前有效的值不同的值。 执行 OPEN 语句会导致 BLANK=DELIM=PAD= 说明符的任何新值生效,但不会导致任何未指定说明符或文件位置发生任何更改。 先前执行的 OPEN 语句中的任何 ERR=IOSTAT= 说明符都不会影响当前 OPEN 语句。 如果指定 STATUS= 说明符,那么它必须具有值 OLD。 要指定与当前连接到单元的文件相同的文件,可以指定相同的文件名,省略 FILE= 说明符或指定以符号方式链接到同一文件的文件。

如果文件已连接到单元,那么无法对该文件和其他单元执行 OPEN 语句。

如果 STATUS= 说明符具有值 OLDNEWREPLACE,那么 FILE= 说明符是可选的。

虽然可以更改 BLANK=DELIM=PAD= 说明符的值,但不能指定单元 0 以连接到除预连接文件 (标准错误设备) 以外的文件。

如果设置了 ERR=IOSTAT= 说明符并迂到错误,那么将传输到 ERR= 说明符指定的语句,并将正整数值分配给 ios

如果未指定 IOSTAT=ERR=
  • 如果遇到严重错误,那么程序停止
  • 如果迂到可恢复错误,并且 ERR_RECOVERY 运行时选项设置为 YES,那么程序将继续执行下一个语句。 如果该选项设置为 NO,那么程序将停止。

示例

Fortran 2008 开始
Example 1: 将 "hello world" 写入文件 "hello"
INTEGER unit_number
OPEN(newunit = unit_number, file = 'hello')
WRITE(unit_number, *) 'hello world'
CLOSE(unit_number)
Fortran 2008 结束

Example 2:

!   Open a new file with name fname

CHARACTER*20 FNAME
FNAME = 'INPUT.DAT'
OPEN(UNIT=8,FILE=FNAME,STATUS='NEW',FORM='FORMATTED')

OPEN (4,FILE="myfile")
OPEN (4,FILE="myfile", PAD="NO")  ! Changing PAD= value to NO

!   Connects unit 2 to a tape device for unformatted, sequential
!   write-only access:

OPEN (2, FILE="/dev/rmt0",ACTION="WRITE",POSITION="REWIND", &
&   FORM="UNFORMATTED",ACCESS="SEQUENTIAL",RECL=32767)

相关信息