请告诉我如何在运行时获得当前操作系统的文件分隔符,例如Windows的和Unix的
/
。
您可以使用Fortran 2003标准内在过程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)
中寻找""。
据我所知,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
子句。这比像其他答案建议的那样引入检查特定环境变量的单个解决方案要容易得多。
除了指定路径分隔符之外,您可能还需要为操作系统环境的其他方面设置参数。例如,当前目录和父目录字符(在Windows和POSIX系统下分别为.
和..
)。
最后,请注意预处理器定义的__unix__
和_WIN32
是广泛使用的宏,它们指示您在哪个系统上,其中一个应该由大多数编译器设置,这取决于您在哪个系统上。如果没有设置它们,通常可以在编译源代码时使用-D__unix__=1
或-D_WIN32=1
标志来设置这些宏之一。使用-cpp
(gfortran)或-fpp
(ifort)命令行选项预处理代码,或将源文件扩展名从.f
更改为.F
或从.f90
更改为.F90
。
根据IRO-bot的建议,您可以创建一个新的环境变量,例如
export DELIMITER='/'
在unix中现在在windows中创建一个相应的变量,只需使用'',就可以了。
如果您不想在windows中设置全局变量,或者没有权限这样做,请将以下内容放入.bat文件
set DELIMITER=
关于set的更多信息,请参见http://www.ss64.com/nt/set.html当使用set.
时,您可能必须从CMD运行fortran程序。最后将以下内容放入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操作系统上测试过这个概念。