print和write都支持列表导向格式和显式格式。二者真正的区别在输出目标:print固定写入默认输出设备,write可以指定输出单元,也可以把格式化结果写入字符变量。
语法结构
print format, output_list
write (unit, format) output_list
write (character_variable, format) output_list
- print没有输出单元参数,输出目标始终是默认输出设备。
- write括号中的第一项是输出目标。写成*时使用默认输出设备,写成字符变量时执行内部文件输出。
- 格式既可以是*,也可以是"(A,I0)"一类显式格式。这项能力由两条语句共享。
本文代码
! print固定写入默认输出设备,write还可以写入字符变量。
program printAndWriteDemo
implicit none
integer :: sampleCount
character(len=80) :: message
sampleCount = 42
message = "尚未写入"
print "(A,I0)", "print写入默认输出:", sampleCount
write (*,"(A,I0)") "write写入默认输出:", sampleCount
print "(A,A)", "内部write前:", trim(message)
write (message,"(A,I0)") "write写入字符变量:", sampleCount
print "(A,A)", "内部write后:", trim(message)
end program printAndWriteDemo
编译运行
(base) hong@hongdeMacBook-Pro 032.printAndWrite % gfortran -Wall -Wextra -std=f2018 examplePrintAndWrite.f90
(base) hong@hongdeMacBook-Pro 032.printAndWrite % ./a.out
print写入默认输出:42
write写入默认输出:42
内部write前:尚未写入
内部write后:write写入字符变量:42
现象分析
前两行分别由print和write (*)产生。两条语句使用相同的(A,I0)格式并得到相同形式的终端输出,说明显式格式不是write独有的能力。
执行write (message,…)之前,字符变量保存“尚未写入”。这条内部write本身不会向终端增加一行,而是把格式化结果保存到message中,因此随后读取该变量时得到“write写入字符变量:42”。
核心知识点
- print固定写入默认输出设备;write可以选择输出目标。
- 列表导向格式和显式格式都能用于print与write。
- 以字符变量作为write目标称为内部文件输出,可将数值按指定格式转换并组合成字符串。