WRITE
用途
WRITE 语句是数据传输输出语句。
语法
- output_item
- 是输出列表项。 输出列表指定要传输的数据。 输出列表项可以是:
- 变量名。 一个数组被视为它的所有元素都是按照它们在存储中的排列顺序指定的。
指针必须与目标相关联,并且必须分配可分配的对象。 派生类型对象不能具有在此语句的作用域限定单元之外的任何最终组件。 对 output_item 求值无法生成包含指针的派生类型对象。 格式化语句中结构的结构组件被视为它们以派生类型定义的顺序出现 ; 在无格式语句中,结构组件在其内部表示中被视为单个值(包括填充)。
- 一个表达式
- 隐式-DO 列表,如 隐式-DO 列表 中所述
output_item 不得是过程指针。
- 变量名。 一个数组被视为它的所有元素都是按照它们在存储中的排列顺序指定的。
- io_control
- 是必须包含一个单元说明符 (UNIT=) 的列表,并且还可以包含其他每个有效说明符中的一个:
- [UNIT=] u
- 是一个单元说明符,用于指定要在输出操作中使用的单元。 u 是外部单元标识或内部文件标识。外部单元标识符是指外部文件。 执行下列其中一个操作:
- 值在 1 到 2147483647 范围内的整数表达式
星号,用于标识外部单元 6 并预连接到标准输出
新单位价值
内部文件标识符是指内部文件。 这是一个字符变量的名称,不能是带有向量下标的数组部分。
如果省略可选字符 UNIT= ,那么 u 必须是 io_control_list中的第一项。 如果指定了 UNIT= ,那么还必须指定 FMT= 。
- [FMT=] format
- 是格式说明符,用于指定要在输出操作中使用的格式。 format 是格式标识,可以是:
- FORMAT 语句的语句标签。 FORMAT 语句必须位于同一作用域限定单元中。
- 分配了 FORMAT 语句的语句标签的标量 INTEGER(4) 或 INTEGER(8) 变量的名称。 FORMAT 语句必须位于同一作用域限定单元中。
Fortran 95 不允许分配语句标号。
- 字符常量需要用括号括起来。 只能在括号之间使用 FORMAT 下列出的格式代码。 空白字符可以在左括号之前,或在右括号之后。
- 包含字符数据的字符变量,其最左边的字符位置构成有效格式。 有效格式以左括号开始,以右括号结束。 只能在括号之间使用 FORMAT 语句中描述的格式代码。 空白字符可以在左括号之前,或在右括号之后。 如果 format 是数组元素,那么格式标识符不得超过数组元素的长度。
- 非字符内部类型的数组。 数据必须是字符数组中描述的有效格式标识符。
- 任何字符表达式,但涉及连接指定继承长度的操作数的表达式除外,除非操作数是常量的名称。
- 星号,指定列表定向的格式。
- 名称列表说明符,指定您先前定义的名称列表列表的名称。
如果省略可选字符 FMT= ,那么 format 必须是 io_control_list中的第二个项,并且第一个项必须是省略了 UNIT= 的单元说明符。 不能在同一输出语句中同时指定 NML= 和 FMT= 。
- ASYNCH= char_expr (IBM 扩展)
- 是一个异步 I/O 说明符,用于指示是否将显式连接的单元用于异步 I/O。
char_expr 是一个标量字符表达式,其值为 YES 或 NO。 YES 指定此连接允许异步数据传输语句。 NO 指定此连接不允许使用异步数据传输语句。 指定的值将在文件所允许的传输方法集中。 如果省略此说明符,那么缺省值为 NO。
预连接单元与 ASYNCH= 值 NO连接。
隐式连接的单元的 ASYNCH= 值由对该单元执行的第一个数据传输语句确定。 如果第一个语句执行异步数据传输,并且正在隐式连接的文件允许异步数据传输,那么 ASYNCH= 值为 YES。 否则, ASYNCH= 值为 NO。
- ASYNCHRONOUS=char_expr (Fortran 2003)
- 允许执行继续,而无需等待数据传输完成。 char_expr 是必须求值为 YES 或 NO的标量字符表达式。 除非 UNIT= 指定文件单元号,否则不得显示 ASYNCHRONOUS=YES 。 如果显示 ID= ,那么还必须显示 ASYNCHRONOUS=YES 。
如果 ASYNCHRONOUS=NO 或者 ASYNCHRONOUS= 和 ID= 都不存在,那么语句和 I/O 操作是同步的。 对于 ASYNCHRONOUS=YES ,或者如果出现 ID= ,那么仅允许对在 OPEN 语句中使用 ASYNCHRONOUS=YES 打开的外部文件执行异步 I/O。
如果在异步数据传输语句中使用变量作为 I/O 列表中的项,名称列表中的组对象或作为 SIZE= 说明符,那么将在数据传输语句的作用域限定单元中隐式给定 data_ref 的基本对象 ASYNCHRONOUS 属性。 对于异步非推进输入, SIZE= 说明符中指定的存储单元将与执行相应等待操作时传输的字符计数一起定义。 对于异步输出、暂挂 I/O 存储序列变换器不得重新定义,取消定义或更改其指针关联状态。 对于异步输入,不应引用暂挂 I/O 存储序列情感变量,使其定义,取消定义,使其与具有 VALUE 属性的哑参数相关联,或使其指针关联状态更改。
当先前执行的异步数据传输语句发生错误、文件结束或记录结束条件时,将对该单元上的所有暂挂数据传送操作执行等待操作。 在后续语句期间发生条件时,将执行由 IOSTAT=, IOMSG=, ERR=, END=和 EOR= 说明符为该语句指定的任何操作。
等待操作由 WAIT, CLOSE或文件定位语句执行。
- DECIMAL= char_expr(Fortran 2003)
- 在 I/O 语句的持续时间内临时更改缺省 十进制编辑方式 。 char_expr 是一个标量字符表达式,其值必须求值为 POINT或 COMMA。 在每个 WRITE 语句之后,该方式缺省为在该单元的 OPEN 语句上指定 (或假定) 的任何十进制方式。
- POS=integer_expr(Fortran 2003)
- integer_expr 是一个大于 0 的整数表达式。 POS= 指定要在为流访问而连接的文件中写入的文件存储单元的文件位置。 不得将 POS= 用于无法定位的文件。
- REC= integer_expr
- 是一个记录说明符,用于指定要在为进行直接访问而连接的文件中写入的记录的编号。 仅允许将 REC= 说明符用于直接输出。 integer_expr 是一个整数表达式,其值为正数。 如果格式是列表定向的,或者如果单元说明符指定了内部文件,那么记录说明符无效。 记录说明符表示文件中记录的相对位置。 第一条记录的相对位置号为 1。 不得在指定为流访问而连接的单元的数据传输语句中指定 REC= ,也不得使用 POS= 说明符。
- ROUND= char-expr(Fortran 2003)
在此 I/O 语句的持续时间内临时更改 I/O 舍入方式的当前值。 如果省略,那么舍入方式不变。 char-expr 求值为 UP, DOWN, ZERO, NEAREST, COMPATIBLE 或 PROCESSOR_DEFINED
舍入方式有助于指定在有格式和输入和输出期间如何将十进制数从字符表示转换为内部表示(即二进制),或者反向转换。 舍入方式具有以下函数:
- 在 UP 舍入方式下,来自转换的值是大于或等于原始值的最小值。
- 在 DOWN 舍入方式下,来自转换的值是小于或等于原始值的最大值。
- 在 ZERO 舍入方式下,来自转换的值是与原始值最接近的值,而不大于量级。
- 在 NEAREST 舍入方式中,来自转换的值是两个最接近的可表示值中最接近的值。 如果两个值的接近程度相同,那么将选择偶数值。 在 IEEE 舍入转换中,NEAREST 对应于 IEEE 标准所指定的 ieee_nearest 舍入方式。
- 在 COMPATIBLE 舍入方式下,来自转换的值是两个最接近的可表示值中最接近的值,或者如果中间距离为零,那么值离零更远。
- 在 PROCESSOR_DEFINED 舍入方式下,来自转换的值依赖于处理器,并且可能对应于其他方式。 在 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。
- IOMSG= iomsg_variable(Fortran 2003)
- 是输入/输出状态说明符,用于指定输入/输出操作返回的消息。 iomsg_variable 是标量缺省字符变量。 它不能是与用法关联的非指针保护变量。 当包含此说明符的输入/输出语句完成执行时,iomsg_variable 定义如下:
- 如果发生错误、文件结束或记录结束条件,那么将为变量赋予一条解释性消息,就如同赋值一样。
- 如果未发生此类情况,那么变量的值将保持不变。
- IOSTAT= ios
- 是输入/输出状态说明符,用于指定输入/输出操作的状态。 ios 是整数变量。 对 IOSTAT= 说明符进行编码可禁止错误消息。 语句完成执行时,ios 定义方式为:
- 如果未发生错误情况,那么值为零
- 如果发生错误,那么值为正数。
- 标识 = integer_variable(IBM 扩展)
- 指示要以异步方式执行数据传输。 integer_variable 是整数变量。 如果未遇到错误,那么在执行异步数据传输语句之后,将使用某个值定义 integer_variable 。 必须在匹配的 WAIT 语句中使用此值。
异步数据传输必须是直接无格式、顺序无格式或流无格式。 禁止对内部文件执行异步 I/O。 禁止对原始字符设备 ( 例如,磁带或原始逻辑卷 ) 执行异步 I/O。 integer_variable 不得与数据传输 I/O 列表中的任何实体相关联,也不得与数据传输 I/O 列表中的 Io_implied_do 的 do_variable 相关联。 如果 integer_variable 是数组元素引用,那么其下标值一定不会受到数据传输、Io_implied_do 处理或 Io_control_spec 中任何其他说明符的定义或求值的影响。
- DELIM= char_expr(Fortran 2003)
- 指定使用哪些定界符 (如果有) 来定界使用列表定向或名称列表格式编写的字符常量。 char_expr 是一个标量字符表达式,其值必须求值为 APOSTROPHE, QUOTE或 NONE。 如果值为 APOSTROPHE,那么将使撇号定界字符常量和字符常量中的所有撇号加倍。 如果值为 QUOTE,那么将对字符常量进行双引号定界,并对字符常量中的所有双引号进行双引号。 如果值为 NONE,那么不会对字符常量进行定界,并且不会将任何字符加倍。 缺省值为 NONE。 DELIM= 说明符仅允许用于为格式化输入/输出而连接的文件,尽管在格式化记录的输入期间会将其忽略。
- ERR= stmt_label
- 是一个错误说明符,它指定在同一作用域单元(在发生错误的情况下,控制权将转移到该控制单元)中的可执行语句的语句标号。 对 ERR= 说明符进行编码可禁止错误消息。
- NUM= integer_variable(IBM 扩展)
- 是一个数字说明符,用于指定在 I/O 列表和文件之间传输的数据的字节数。 integer_variable 是整数变量。 仅允许对未格式化的输出使用 NUM= 说明符。 对 NUM 参数进行编码将禁止指示在输出列表所表示的字节数大于可写入记录的字节数时将发生的错误。 在这种情况下,integer_variable 设置为表示可以写入的最大长度记录的值。 剩余输出列表项中的数据不会写入后续记录中。 在异步数据传输语句与匹配的 WAIT 语句之间执行的程序部分中,不能引用,定义或取消定义 NUM= 说明符中的 integer_variable 或与其关联的任何变量。
- [NML=] name
- 是一个名称列表说明符,指定您先前定义的名称列表列表的名称。 如果未指定可选字符 NML= ,那么名称列表名称必须显示为列表中的第二个参数,并且第一个项必须是省略了 UNIT= 的单元说明符。 如果同时指定了 NML= 和 UNIT= ,那么所有参数都可以按任意顺序显示。 NML= 说明符是 FMT=的替代方法。 不能在同一输出语句中同时指定 NML= 和 FMT= 。
- ADVANCE= char_expr
- 是一个高级说明符,用于确定是否出现此语句的非高级输出。 char_expr 是必须求值为 YES 或 NO的字符表达式。 如果指定了 NO ,那么将发生非推进输出。 如果指定了 YES ,那么将进行前进,格式化顺序或格式化流输出。 缺省值为 YES。 只能在具有不指定内部文件单元说明符的显式格式规范的格式化顺序 WRITE 语句中指定 ADVANCE= 。
规则
如果存在 NUM= 说明符,那么既不能存在格式说明符,也不能存在名称列表说明符。
为 IOSTAT= 和 NUM= 说明符指定的变量不得与任何输出列表项,名称列表项或隐式DO 列表的 DO 变量相关联。 如果此类说明符变量是数组元素,那么其下标值不得受数据传输,任何隐式-DO 处理或任何其他说明符的定义或求值影响。
如果设置了 ERR= 和 IOSTAT= 说明符,并且在同步数据传输期间迂到错误,那么将传输到 ERR= 说明符指定的语句,并将正整数值分配给 ios。
如果设置了 ERR= 或 IOSTAT= 说明符,并且在异步数据传输期间迂到错误,那么不需要执行匹配的 WAIT 语句。
如果迂到转换错误,并且 CNVERR 运行时选项设置为 NO,那么 ERR= 不会分支到,尽管可以设置 IOSTAT= 。
- 如果遇到严重错误,那么程序将停止。
- 如果迂到可恢复错误,并且 ERR_RECOVERY 运行时选项设置为 YES,那么程序将继续执行下一个语句。 如果该选项设置为 NO,那么程序将停止。
- 如果 ERR_RECOVERY 运行时选项设置为 YES,那么当迂到转换错误时,程序将继续执行下一个语句。 如果 CNVERR 运行时选项设置为 YES,那么转换错误将被视为可恢复错误; 当 CNVERR=NO时,它们将被视为转换错误。

PRINT format 与 WRITE(*,format) 的效果相同。
示例
WRITE (6,FMT='(10F8.2)') (LOG(A(I)),I=1,N+9,K),G
