Io 当用户只需在标准输入中按enter键时,将使用默认值
我的程序需要用户对某些变量进行标准输入Io 当用户只需在标准输入中按enter键时,将使用默认值,io,fortran,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
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代码对输入做出反应?首先读取字符串。然后检查它是否包含有效数字
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
先读一个字符串。然后检查它是否包含有效数字
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
您有一个答案,它给出了在输入无效的情况下应用默认值的方法。在这个答案中,我将解释为什么按enter键似乎什么都不做 使用列表定向输入
read(*,*) maxStep
在没有任何其他值的情况下按enter键只会结束第一条输入记录。然而,使用这种类型的输入,它实际上不会从input语句返回执行:它只被视为空白(就像输入了空格一样)。input语句仍在等待值
您将看到,读入字符串的答案通过使用显式格式(此处(a)
)避免了列表定向输入。这当然是可行的。另一种方法是使用特定于整数的格式
read(*,'(I10)') maxStep
如果连接的pad模式为“是”,则按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
[前两行可能不是必需的:pad模式的默认值为'YES'
]
如果您愿意将错误留给终止来处理,则此方法还可以避免使用
iostat=
。如果愿意,您当然可以使用iostat=
。您有一个答案,它给出了在输入无效的情况下应用默认值的方法。在这个答案中,我将解释为什么按enter键似乎什么都不做
使用列表定向输入
read(*,*) maxStep
在没有任何其他值的情况下按enter键只会结束第一条输入记录。然而,使用这种类型的输入,它实际上不会从input语句返回执行:它只被视为空白(就像输入了空格一样)。input语句仍在等待值
您将看到,读入字符串的答案通过使用显式格式(此处(a)
)避免了列表定向输入。这当然是可行的。另一种方法是使用特定于整数的格式
read(*,'(I10)') maxStep
如果连接的pad模式为“是”,则按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
[前两行可能不是必需的:pad模式的默认值为'YES'
]
如果您愿意将错误留给终止来处理,则此方法还可以避免使用
iostat=
。如果您愿意,当然可以使用iostat=
。好主意,不过我会检查是否有空字符串作为默认值。键入错误的数字不应导致默认值。你也可以把它放在一个循环中,重新编译另一个条目以从错误中恢复。好吧,当然,但这是在OP上,而不是在我身上设置确切的条件。如果你查看原始代码,他会检查负数并停止。他也可以把这张支票留在那里。基本上,这不是一个代码编写服务,所以解决方案通常不是完全完成的工作代码。但这使得无效数字未被检查。他们是应该选择崩溃还是违约,这取决于OP@Vladimir感谢你周到的回答。我从来没有想过我可以读取行变量。它工作得很好。好主意,不过我会检查一个空字符串作为默认值。键入错误的数字不应导致默认值。你也可以把它放在一个循环中,重新编译另一个条目以从错误中恢复。好吧,当然,但这是在OP上,而不是在我身上设置确切的条件。如果你查看原始代码,他会检查负数并停止。他也可以把这张支票留在那里。基本上,这不是一个代码编写服务,所以解决方案通常不是完全完成的工作代码。但这使得无效数字未被检查。他们是应该选择崩溃还是违约,这取决于OP@Vladimir感谢你周到的回答。我从来没有想过我可以读取行变量。效果很好,真的很有帮助。我想我更深入地理解了格式规范在IO语句中的作用,这真的很有帮助。我想我更深刻地理解了格式规范是如何在IO语句上工作的。