2013-10-29 61 views
2

在我的程序中,我需要存儲不同情況下的結果文件。我決定創建單獨的目錄來存儲這些結果文件。在這裏解釋確切的情況是一個僞代碼。在FORTRAN中創建名稱中包含實數的目錄

do i=1,N  ! N cases of my analysis 
    U=SPEED(i) 
    call write_files(U)  !Create a new directory for this case and Open files (1 = a.csv, 2 = b.csv) to write data 
    call postprocess()  !Write data in files (a.csv, b.csv) 
    call close_files()  !Close all files (1,2) 
end do 

subroutine write_files(i) 
    !Make directory i 
    !Open file a.csv and b.csv with unit 1 & 2 
    !Write header information in file a.csv and b.csv 
close subroutine 

我奮力的將真實變量U爲一個字符變量,這樣我可以使用call system('mkdir out/' trim(U))創建單獨的文件夾來存儲我的結果。

我也想提一提,我的變量u的速度是一樣0.00000, 1.00000, 1.50000等是否有辦法,我可以簡化我的目錄名稱,因此它就像0,1,1.5

希望我的解釋是明確的。如果不讓我知道,我會盡量根據需要進行編輯。

謝謝你的幫助。

回答

2

system的參數需要是一個字符串。因此,您必須將real轉換爲字符串並將mkdir out/與該字符串連接。下面是一個簡單的例子:

module dirs 
contains 
    function dirname(number) 
    real,intent(in) :: number 
    character(len=6) :: dirname 

    ! Cast the (rounded) number to string using 6 digits and 
    ! leading zeros 
    write (dirname, '(I6.6)') nint(number) 
    ! This is the same w/o leading zeros 
    !write (dirname, '(I6)') nint(number) 

    ! This is for one digit (no rounding) 
    !write (dirname, '(F4.1)') number 
    end function 
end module 

program dirtest 
    use dirs 

    call system('mkdir -p out/' // adjustl(trim(dirname(1.)))) 
end program 

代替call system(...)這是不規範的,你可以使用Fortran 2008年的聲明execute_command_line(如果你的編譯器支持的話)。

call execute_command_line ('mkdir -p out/' // adjustl(trim(dirname(1.)))) 
+0

這個(v1)的問題在於'number = 1.0'和'number = 1.3',我們有'dirname'是一樣的。用'nint(數字* 10.0)'來確保不同之處可能會更好。 –

+0

@KyleKanos:我添加了類似的第三個選項...雖然這不是四捨五入,只是切割。但將它與您的方法相結合將是一個簡單的練習!感謝您指出... –

+0

@AlexanderVogt:沒問題。我將用我在評論中給出的方法寫一個答案,但是你擊敗了我。 –

相關問題