在 fortran 中读取一个浮点数并修改基于变量的文件:正确的格式

Reading a float and modifying variable based file in fortran : correct format

我正在尝试编写代码以读取变量 (Delta),并基于此我正在尝试复制相应的文件 (TESTDIR/Delta0.5_DOS_2D_TBM.data DOS.data对于 Delta=0.5) 到当前目录。

        Program Modify_variable_based_file
        character(LEN=100):: command
        character(LEN=10):: chDelta
        real*8:: Delta

        Print*,'Enter Delta'
        Read*,Delta

        write(chDelta,'(f0.1)') Delta
        print*,'chDelta=',chDelta,' Delta=',Delta

        command='cp TESTDIR/Delta' // trim(adjustl(chDelta)) //'_DOS_2D_TBM.data DOS.data'
        call system(command)

        End Program Modify_variable_based_file

但是,当我输入 Delta 时,我可以看到 chDelta.5 而不是 0.5。 你能建议我正确的格式吗?有没有其他方法可以避免字符串转换?

注意这里我的文件是用小数点左边最高位的数字命名的,即如果Delta1.5,文件就是Delta1.5_DOS_2D_TBM.data。只有当没有其他有效数字时,小数点前才会出现零。

如果只需要小数点后一位,可以使用f20.1等,这样

character(LEN=100) :: chDelta    !! use a sufficiently large buffer

write( chDelta,'(f20.1)' ) Delta
chDelta = adjustL( chDelta )

那么Delta=0.5对应的chDelta就变成了“0.5”(注意adjustL()去掉了0之前的所有空格)。同样,你可以使用格式

来保留 4 位数字
write( chDelta,'(f20.4)' ) Delta

chDelta = "0.5000"。为了在小数点后获得灵活数量的非零数字,我们可能需要手动删除不必要的零。例如,这可以通过搜索最后一个非零数字并删除尾随零来完成。

real*8 x( 5 )
character(100) str

x(:) = [ 1.0d0, 0.2d0, 1.23d0, -123.456d0, 123.678901d0 ]

do i = 1, 5
    write( str, "(f20.4)" ) x(i)
    call truncate( str, 4 )
    print *, "file", trim(str), ".dat"
enddo
...

subroutine truncate( str, dmax )
    implicit none
    character(*), intent(inout) :: str
    integer,      intent(in)    :: dmax   !! maximum number of nonzero digits
    integer :: dot, k, last

    str = adjustL( str )
    dot = index( str, '.' )

    do k = dot + dmax, dot, -1
        if ( str( k:k ) /= '0' ) then
            last = k
            exit
        endif
    enddo
    if ( last == dot ) last = last + 1   !! retain at least one digit

    str = str( 1:last )
end

那么输出就变成了

file1.0.dat
file0.2.dat
file1.23.dat
file-123.456.dat
file123.6789.dat