在 Fortran 中获取文件分隔符

Ser*_*her 5 fortran operating-system environment-variables path-separator

您能否告诉我如何在运行时获取当前操作系统的文件分隔符,例如\在 Windows 和Unix 中,在 Fortran 中。/

Chr*_*ris 5

据我所知,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
Run Code Online (Sandbox Code Playgroud)

但是,在 Windows 上,您可以使用/\作为路径分隔符(尝试一下!),因此在大多数系统上,无需对路径分隔符执行任何特殊操作。

请注意,您不需要在运行时确定路径分隔符。由于您必须为要在其上运行的每个新系统重新编译 Fortran 源代码,因此您只需确保在编译时为每个新系统指定正确的路径分隔符(路径分隔符在程序运行之间不会改变)在同一系统上)。

使用上面的预处理器宏是执行此操作的明显方法:您只需#elif为将代码移植到的每个新系统添加一个新子句即可。这比引入像其他答案所建议的那样检查特定环境变量的零碎解决方案要容易得多。

除了指定路径分隔符之外,您可能还需要为操作系统环境的其他方面设置参数。例如,当前目录字符和父目录字符(.分别..在 Windows 和 POSIX 系统下)。

最后,请注意,预处理器定义__unix___WIN32广泛使用宏,这些宏指示您所在的系统,并且大多数编译器应该设置一个宏,具体取决于您所在的系统。如果未设置它们,您通常可以使用该标志-D__unix__=1-D_WIN32=1在编译源代码时设置这些宏之一。-cpp要使用(gfortran) 或(ifort) 命令行选项预处理代码-fpp,或将源文件扩展名从.f改为.F或从.f90改为.F90.


mil*_*cic 5

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

该程序将输出“/”作为 UNIX 或 Linux 中的路径分隔符。您也可以从其他环境变量中获取它。请注意,此示例针对 UNIX/Linux 进行了硬连线。对于Windows,您需要一些不同的逻辑来提取例如“\”,但我不熟悉这个系统。我依稀记得从 Win95 开始有类似“c:\.....”的东西,所以在 Windows 中你很可能会在path(3:3).

希望这可以帮助。