String 在fortran中读取浮点并修改基于变量的文件:正确格式
我试图编写一个代码,在其中读取一个变量(String 在fortran中读取浮点并修改基于变量的文件:正确格式,string,format,fortran,fortran90,String,Format,Fortran,Fortran90,我试图编写一个代码,在其中读取一个变量(Delta),并基于此,我试图将相应的文件(TESTDIR/Delta0.5_DOS\u 2D_TBM.dataDOS.dataforDelta=0.5)复制到当前目录 Program Modify_variable_based_file character(LEN=100):: command character(LEN=10):: chDelta real*8:: Delta
Delta
),并基于此,我试图将相应的文件(TESTDIR/Delta0.5_DOS\u 2D_TBM.data
DOS.data
forDelta=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\u DOS\u 2D\u 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
为0.5时,您希望chDelta
为“0.5”?将0.5作为字符串(chDelta)读取并在必要时使用内部文件从chDelta读取Delta不是更简单吗?@Ross,是的,我希望如此@roygvib,不,这是不可能的,有大量文件是通过在变量上运行循环生成的,0.5
是一个典型的例子。所以你的问题实际上是:?我很困惑。如果delta是real类型(p.s.real*8不是Fortran),你怎么能期望区分0.25和00.25,实际上是0.250和00.250,因为对于实数,它们都是一样的?谢谢@roygvib,实际上adjustl
已经存在于命令中,所以我可能不需要这样做,但是f20.1
绝对是0.5
的正确格式。您还提供了一个非常通用的解决方案,非常有用。:)很好,如果它工作:)虽然我也尝试了G格式,但它也不工作(例如,g0.1给出了0.5的“.5”)。所以转换有点尴尬。。。干杯