能否请您告诉我如何获取当前操作系统的文件分隔符,例如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