[英]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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.