3

能否請您告訴我如何獲取當前操作系統的文件分隔符,例如Windows中的\和Unix中的/,運行時在Fortran中。在Fortran中獲取文件分隔符

+0

「當前操作系統的路徑分隔符」?那是什麼? – Rook 2011-12-24 13:50:10

+0

編輯當前操作系統 - 程序運行的操作系統 – 2011-12-24 16:35:23

+0

啊,當然..... – Rook 2011-12-24 16:42:54

回答

4

您可以使用Fortran 2003 Standard內部過程GET_ENVIRONMENT_VARIABLE來做這樣的事情。例如:

CHARACTER(LEN=99999) :: path 
CHARACTER(LEN=1)  :: path_separator 
CALL GET_ENVIRONMENT_VARIABLE('PATH',path) 
path_separator=path(1:1) 
WRITE(*,*)'Path separator is ',path_separator 
END 

該程序將在UNIX或Linux中輸出「/」作爲路徑分隔符。你也可以從其他環境變量中得到這個。注意,這個例子在UNIX/Linux上是硬連線的。您需要一些不同的邏輯來提取例如「\」用於Windows,但我對此係統不熟悉。我隱約記得從Win95有像「C:\ .....」這樣的東西,所以很有可能在Windows的情況下,你會在path(3:3)中尋找「\」。

希望這會有所幫助。

+1

您是否需要從PATH環境變量中讀取99999個字符才能提取第一個字符? – Chris 2012-01-08 12:50:37

+0

@Chris +1號當我不得不假設長度(例如,我不知道在Windows中看起來是什麼樣子)時,我會選擇任意長。我相信99的長度會很好。 – milancurcic 2012-01-08 14:58:23

+0

@Chris另外,請注意99999個字符不會被實際讀取。程序會讀取路徑的長度。其餘的只會留在記憶中。 – milancurcic 2012-01-08 15:00:23

3

據我所知,Fortran標準沒有提到有關文件系統路徑分隔符的任何信息。我可以建議的最好的是定義一個宏來定義合適的分隔符。例如

#if __unix__ 
character(len=1), parameter :: path_sep='/' 
#elif _WIN32 
character(len=1), parameter :: path_sep='\' 
#else 
#error "path_sep not defined. Set this constant for your system." 
#endif 

然而,在Windows上,你可以使用/\作爲路徑分隔符(試試吧!),所以在大多數系統上沒有必要做任何特殊的路徑分隔符。

請注意,您不需要在運行時確定路徑分隔符。由於您必須爲每個要運行的新系統重新編譯Fortran源代碼,因此只需確保在編譯時爲每個新系統指定了正確的路徑分隔符()路徑分隔符不會在您的程序在同一系統)。

使用像上面那樣的預處理器宏是這樣做的明顯方法:您可以爲每個將代碼移植到的新系統添加新的#elif子句。這比引入picemeal解決方案更容易,這些解決方案像其他答案所暗示的那樣檢查特定的環境變量。

另外,指定路徑分隔符還可能需要爲操作系統環境的其他方面設置參數。例如,當前和父目錄字符(在Windows和POSIX系統下分別爲...)。

最後,請注意,預處理器定義的__unix___WIN32是廣泛使用的宏,它們表示您在哪個系統上,哪一個系統上,應該由大多數編譯器設置。如果它們沒有設置,那麼在編譯源代碼以設置其中一個宏時,通常可以使用標記-D__unix__=1-D_WIN32=1。要使用-cpp(gfortran)或-fpp(ifort)命令行選項預處理代碼或將源文件擴展名從.f更改爲.F或將.f90更改爲.F90

+0

我沒有成功。我有錯誤,這是非法的預處理器指令。我使用gfortran編譯器 – 2011-12-24 23:47:43

+0

您必須對文件進行prerosrosses。將您的文件擴展名從.f更改爲.F或從.f90更改爲.F90。或者,如果您使用的是intel編譯器,則可以在使用這些預處理器編譯文件時使用-fpp標誌。 – Chris 2011-12-27 17:58:11

+0

@Sergey對不起,剛注意到你說你正在使用gfortran。要調用預處理器,請使用-cpp標誌。 – Chris 2011-12-27 18:05:13

1

繼IRO-BOT的建議,你可以做一個新的環境變量,例如

export DELIMITER='/' 
在UNIX

現在使窗口對應的變量,只要用「\」,你是好去。

如果你不想在Windows中設置一個全局變量,或者沒有權利這樣做,放在一個.bat文件

set DELIMITER=\ 

以下更多關於設置,見http://www.ss64.com/nt/set.html 使用set時,您可能必須從CMD運行fortran程序。

Finaly把你的Fortran文件下列

CHARACTER :: delimiter 
CALL get_environment_variable('DELIMITER',delimiter) 
0

我比較贊成的4上面的解決方案,但有一個修改:

function delimiter_detect() result(delim) 
    character(LEN=1) :: delim 
    character(LEN=258) :: path 
    integer :: ii, stat_out 
    call GET_ENVIRONMENT_VARIABLE('HOME',path,status=stat_out) 
    if (stat_out/=0) go to 999 
    ! xxx path='xx\' ! alternate test 
    do ii=1, 258 
    delim=path(ii:ii) 
    if (delim=='/'.or.delim=='\') return 
    ! ... Note: emacs does not recognize the second delimiter test 
    enddo 
999 continue 
write(*,'(1x,a/1x,a/1x,a)') 'Could not obtain home directory path.', & 
    'Restart program and manually insert path', & 
    'to folder/directory containing input files.' 
stop 
end function delimiter_detect 

這麼說,我還沒有測試的概念在Windows操作系統。

+1

你能解釋一下這個修改是什麼嗎?您提及的答案並不明顯。 – francescalus 2015-10-04 19:37:44