我有一个这样的输入文件:
x = 1.5
y = 2.8
z = 9.4
x = 4.2
我想设置变量的值。 所以,我这样做:
read(1,'(A)', IOSTAT=io) str
if (io > 0) then !error
write(*,*) 'Check input. Something was wrong'
exit
else if (io < 0) then !EOF
exit
else !read new value
do i=1,len_trim(str)
if (str(i:i) == "=") str(i:i) = " " !replase "=" with spaces
end do
read(str, *) curvar, curval
SELECT CASE (curvar)
CASE ("x")
x = curval
CASE ("y")
y = curval
CASE ("z")
z = curval
END SELECT
是否可以将名称存储在“ curvar”中的变量设置为与“ curval”中的值相等而无需“ CASE SELECT”?我认为存在一些更简单的方法。我需要它,因为我的程序将拥有比三个更多的变量。
答案 0 :(得分:2)
如果您可以在文件的开头和结尾进行非常小的更改,则可以使用名称列表。例如,请参见:http://jules-lsm.github.io/vn4.2/namelists/intro.html
&namelist_name
x = 1.5
y = 2.8
z = 9.4
/
带有简单的Fortran代码
namelist /namelist_name/ x, y, z
read(unit, nml = namelist_name)
否则,答案是否定的,就不能仅从配置文件中为具有特定名称的变量赋值,而无需解析名称并使用某些条件或选择大小写或指针数组等。为了方便起见,Fortran名称列表I / O会执行此操作。
或者有一些库可以完成类似的工作并允许各种形式的配置文件。 This answer在命令行参数的上下文中讨论了这些选项。有各种形式的配置文件库,但是例如天气预报和气候预测模型通常仅使用名称列表。对于我的模型,我写了own parser,它为结构化数据提供了更多选项,但没有文档说明,因此对其他人更难使用。