我的程序需要用户对某些变量进行标准输入。
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作出反应?
答案 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=
。