能否請您告訴我如何獲取當前操作系統的文件分隔符,例如Windows中的\
和Unix中的/
,運行時在Fortran中。在Fortran中獲取文件分隔符
回答
您可以使用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)
中尋找「\」。
希望這會有所幫助。
您是否需要從PATH環境變量中讀取99999個字符才能提取第一個字符? – Chris 2012-01-08 12:50:37
@Chris +1號當我不得不假設長度(例如,我不知道在Windows中看起來是什麼樣子)時,我會選擇任意長。我相信99的長度會很好。 – milancurcic 2012-01-08 14:58:23
@Chris另外,請注意99999個字符不會被實際讀取。程序會讀取路徑的長度。其餘的只會留在記憶中。 – milancurcic 2012-01-08 15:00:23
據我所知,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
。
繼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)
我比較贊成的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操作系統。
你能解釋一下這個修改是什麼嗎?您提及的答案並不明顯。 – francescalus 2015-10-04 19:37:44
- 1. Fortran:讀取字符串中帶有不規則分隔項的文本文件
- 2. 如何在javascript中獲取系統文件分隔符?
- 3. 在Fortran中讀取文件
- 4. Fortran小數點和千位分隔符
- 5. PYTHON:在文本文件中讀取不適用於分隔符
- 6. 讀取存儲在csv文件中的rgb值,用逗號分隔符分隔
- 7. Tilde(〜)分隔文件在SSIS中讀取
- 8. 在C++中讀取分隔文件
- 9. 在分隔符上分割文件
- 10. 在c#中讀取/寫入CSV /製表符分隔文件
- 11. Ruby文件IO分隔符?
- 12. 讀取文件(FORTRAN)
- 13. 如何在Java中獲取時間分隔符符號?
- 14. 獲取子節點的內部文本並將其存儲在由分隔符分隔的字符串中
- 15. LINQ獲取分隔符分隔的字段值
- 16. 獲取autosplit分隔符的值?
- 17. 獲取IFile的行分隔符
- 18. 在Fortran 95中讀取多個文件
- 19. Java行分隔符文件.ext分隔符
- 20. 文件分隔符常量顯示假分隔符?
- 21. str_getcsv在製表符分隔文件
- 22. 級聯 - 如何讀取分隔符分隔文件並獲取特定字段值
- 23. 使用多個分隔符和複製分隔符在CSV文件中分隔列值
- 24. 在R - TAB分隔文件中讀取幾個文件
- 25. Bash:如何從CSV文件的列中獲取帶「分隔符」的列?
- 26. 從帶分隔符的文件中讀取
- 27. 從空格分隔符的文件中讀取
- 28. 如何從\ n分隔文件中讀取字符串
- 29. 用C++中的多個分隔符讀取文件
- 30. 從管道分隔文件中獲取值
「當前操作系統的路徑分隔符」?那是什麼? – Rook 2011-12-24 13:50:10
編輯當前操作系統 - 程序運行的操作系統 – 2011-12-24 16:35:23
啊,當然..... – Rook 2011-12-24 16:42:54