簡體   English   中英

讀取一個float並以fortran修改基於變量的文件:正確格式

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

我試圖寫到哪我想讀一個變量(一個碼Delta ),並基於該我想對應的文件(復制TESTDIR/Delta0.5_DOS_2D_TBM.data DOS.dataDelta=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

暫無
暫無

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM