计算结果与诊断信息用途不同。标准模块iso_fortran_env提供output_unit和error_unit,使程序可以把有效结果写入标准输出,把警告和错误原因写入标准错误。
标准单元
use, intrinsic :: iso_fortran_env, only: output_unit, error_unit
write (output_unit, format) output_list
write (error_unit, format) diagnostic_list
- output_unit承载程序正常产生、可供后续处理的结果。
- error_unit承载非法输入、计算失败原因和警告等诊断信息。
- 两者的具体整数值由处理器决定,应使用标准命名常量,而不是硬编码5、6等惯用单元号。
物理计算中的用途
圆面积公式S=πr²在数学上可以代入负数,但圆的半径在物理意义上不能为负。本例先计算半径2.5对应的有效面积,再检查另一项半径数据-1.0。有效结果进入output_unit,违反物理约束的数据进入error_unit。
本文代码
! 合法的物理计算结果与非法输入诊断写入不同输出单元。
program outputUnitsDemo
use, intrinsic :: iso_fortran_env, only: output_unit, error_unit
implicit none
real, parameter :: pi = 3.14159265
real :: radius
real :: area
radius = 2.5
area = pi * radius**2
write (output_unit,"(A,F0.2,A,F0.2)") "半径:", radius, ",面积:", area
radius = -1.0
if (radius < 0.0) then
write (error_unit,"(A,F0.2)") "错误:圆的半径不能为负,收到:", radius
end if
end program outputUnitsDemo
直接运行
(base) hong@hongdeMacBook-Pro 040.outputUnits % gfortran -Wall -Wextra -std=f2018 exampleOutputUnits.f90
(base) hong@hongdeMacBook-Pro 040.outputUnits % ./a.out
半径:2.50,面积:19.63
错误:圆的半径不能为负,收到:-1.00
如果只执行./a.out,标准输出和标准错误默认都连接当前终端,因此两行都会显示。
分别重定向
(base) hong@hongdeMacBook-Pro 040.outputUnits % ./a.out > normal.txt 2> diagnostic.txt
(base) hong@hongdeMacBook-Pro 040.outputUnits % cat normal.txt
半径:2.50,面积:19.63
(base) hong@hongdeMacBook-Pro 040.outputUnits % cat diagnostic.txt
错误:圆的半径不能为负,收到:-1.00
在当前shell中,进程的标准输出编号为1,标准错误编号为2。省略编号的>等价于1>,所以它把标准输出写入normal.txt;2>把标准错误写入diagnostic.txt。该语法为shell命令非fortran语法。
如果只写./a.out > normal.txt,面积结果进入文件,诊断信息显示在终端;如果只写./a.out 2> diagnostic.txt,诊断进入文件,正常结果仍显示在终端。
核心知识点
- output_unit保存正常结果,error_unit报告非法输入或计算异常。
- 直接运行时两路通常都显示在终端;重定向后可以分别保存或处理。
- >重定向标准输出,2>重定向标准错误。
- 写入error_unit不会自动停止程序,也不会自动设置失败退出状态。