当用户在标准输入中按Enter键时,将使用默认值

时间:2017-06-12 11:14:46

标签: io fortran

我的程序需要用户对某些变量进行标准输入。

 subroutine stdInp(maxStep,gam,tolL)

 integer,intent(inout) :: maxStep
 real(dp),intent(inout) :: gam
 real(dp),intent(inout) :: tolL

 character :: tmpI

 write(*,*) "Max number of iterations?: "
 read(*,*) maxStep

 if (maxStep .le. 0 ) then
   write(*,*) "Invalid number of iterations!"
   stop
 end if

 (...)

我想在程序用户只需要输入值时按ENTER即可使用默认值。

我在搜索中发现了类似的问题,但它们不适用于Fortran。

如何让Fortran代码对ENTER作出反应?

2 个答案:

答案 0 :(得分:0)

首先读取一个字符串。然后检查它是否包含有效数字。

 character(256) :: line

 write(*,*) "Max number of iterations?: "
 read(*,'(a)') line

 if (len_trim(line)==0) then
   maxStep = default_value
 else
   read(line, *, iostat = ierr) maxStep

   if (ierr/=0)  stop !or default
 end if

答案 1 :(得分:0)

您有一个答案,它提供了在无效输入的情况下应用默认值的方法。在这个答案中,我将解释为什么按Enter似乎什么都不做。

使用列表导向的输入

read(*,*) maxStep

按Enter而没有任何其他值只会结束第一个输入记录。但是,使用这种输入方式,它实际上并不从输入语句返回执行:它仅被视为空白(就像输入了空格一样)。输入语句仍然等待一个值。

读到字符串的答案,您将看到,通过使用显式格式(此处为'(A)')来避免列表导向的输入。这当然可行。另一种方法是使用特定于整数的格式

read(*,'(I10)') maxStep

如果连接的pad模式为'YES',则按Enter键结束输入记录意味着输入字段为空白,然后将其解释为将值设置为零。

use, intrinsic :: iso_fortran_env, only : input_unit
open(unit=input_unit, pad='YES')
read(*,'(I10)') maxStep
if (maxStep.eq.0) maxStep=default_maxStep

[前两行可能没有必要:填充模式的默认值为'YES'。]

此方法还可以避免使用iostat=,如果您对通过终止处理错误而感到高兴。如果您愿意,您当然可以使用iostat=