如何从输入文件设置Fortran变量?

时间:2019-03-20 14:22:57

标签: string fortran

我有一个这样的输入文件:

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”?我认为存在一些更简单的方法。我需要它,因为我的程序将拥有比三个更多的变量。

1 个答案:

答案 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,它为结构化数据提供了更多选项,但没有文档说明,因此对其他人更难使用。