在 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
。
你能建议我正确的格式吗?有没有其他方法可以避免字符串转换?
注意这里我的文件是用小数点左边最高位的数字命名的,即如果Delta
是1.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
我正在尝试编写代码以读取变量 (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
。
你能建议我正确的格式吗?有没有其他方法可以避免字符串转换?
注意这里我的文件是用小数点左边最高位的数字命名的,即如果Delta
是1.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