您能否告诉我如何在运行时获取当前操作系统的文件分隔符,例如\
在 Windows 和/
Unix 中,在 Fortran 中。
4 回答
据我所知,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
to.F
或从.f90
to更改为.F90
.
您可以使用 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)
.
希望这可以帮助。
按照 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 操作系统上测试过这个概念。