细说Fortran中的 "print" 与 "write" 语句

学术   教育   2024-09-18 16:57   山东  

在 Fortran 编程时,很多人都会对 printwrite 语句之间的差别心存疑问:都是用于控制台输出,我该选择哪一个?

本文旨在剖析这两个语句的用途、差异以及在现代 Fortran 编程中的推荐实践。

控制台输出的两种方式

在处理控制台输出时,程序员通常会在 printwrite 语句之间做出选择。

「print 语句」

print 语句是 Fortran 77 中引入的,它简洁明了,特别适合于简单的文本输出。例如,print *,'Hello, World!' 会直接将消息打印到控制台。视觉上,print 命令因其简洁性而易于辨认,适用于比较简单的输出场景。

「write 语句」

相比之下,write 语句的历史更为悠久,起源于 Fortran 66,用于设备无关的顺序 I/O 操作。随着时间的推移,write(*,*) 成为了向标准输出打印的标准方式。尽管它在功能上更为灵活,允许格式化输出和定向到不同文件单元,但在不需这些高级功能时,其语法相对繁琐。

汇编层面的等价性

有趣的是,在汇编层面,print *,'hi'write(*,*) 'hi'是完全相同的,这在多个主流编译器(如gfortran, ifort)中得到了验证。使用 gfortran 时,两种输出方法对应的汇编代码均为:

这意味着,从执行效率角度考虑,两者并无区别。这就为程序员提供了灵活性,可以根据个人喜好和项目需求选择使用 printwrite

控制台I/O的标准化

说起规范化编程,就不得不提控制台输入/输出(I/O)的标准化问题。Fortran 2003 通过引入内建模块 iso_fortran_env,终于解决了长期存在的控制台 I/O 模糊性问题。该模块提供了一种标准方式,来引用标准输入(stdin)、标准输出(stdout)和标准错误(stderr),例如:

module mymod
  useintrinsic:: iso_fortran_env, &
  only: stdout=>output_unit, &
  stdin=>input_unit, &
  stderr=>error_unit
end module mymod

这里的「别名操作」(=>)不是必须的,但不得不承认 stdinstdoutstderr 这样的命名确实要更流行一些。

推荐实践

  • 「常规控制台打印」:对于日常简单的信息输出,建议使用 print 语句,如 print *,'my text',以保持代码的清晰和简洁。

  • 「高级控制台打印」:当需要更复杂的输出控制,如输出错误信息、管理非推进式输出或在不同输出目标间切换时,采用 write(stdout,*) 或类似形式会更加合适。

综合实例

下面是一个示例程序,展示了如何使用 iso_fortran_env 模块来引用标准输出,以及如何使用 printwrite 输出语句在控制台和文件之间进行选择性输出。

program main
useintrinsic:: iso_fortran_env, &
  only: stdout=>output_unit
implicit none
character(:), allocatable :: filename
character(256) :: buf
integer :: i, u

! 从命令行获取输出文件名
call get_command_argument(1, buf, status=i)
if (i==0then
  ! 输出目标为文件
  filename = trim(buf)  !自动分配字符串数组大小
  print *, 'writing to ', filename
  open(newunit=u, file=filename, form='formatted')
else
  ! 输出目标为控制台
  u = stdout
endif

i = 3 ! 测试数据
write(u,*) i, i**2, i*3

! 输出结束,关闭非stdout的文件单位
if (u /= stdout) close(u)  
print *,'goodbye'

end program main

小结

总而言之,虽然在某些情况下 printwrite 在功能上可以互换,但根据具体需求选择最合适的语句,能显著提升代码的可读性和维护性。随着 Fortran 语言的不断进步,掌握这些细节对于现代科学计算领域的程序员来说非常重要。通过合理运用 iso_fortran_env 模块和理解 printwrite 语句的最佳实践场景,开发者能够更加高效、清晰地进行输出操作。

推荐阅读

FEtch 系统是笔者团队开发的新一代有限元软件开发平台。只需按照有限元语言格式填写脚本文件,即可在线自动生成基于现代 Fortran 的有限元计算程序,从而大幅提高 CAE 软件的开发效率。欢迎私信交流。

有任何疑问或建议,欢迎加Q群 "FEtch有限元开发系统(519166061)" 留言讨论。我们长期开展 FEtch 系统的试用活动,感兴趣的朋友入群后可直接联系管理员,免费获取许可证文件

有限元语言与编程
面向科学计算,探索CAE,有限元,数值分析,高性能计算,数据可视化,以及 Fortran、C/C++、Python、Matlab、Mathematica 等语言编程。这里提供相关的技术文档和咨询服务,不定期分享学习心得。Enjoy!
 最新文章