4

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

4

4 回答 4

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) 命令行选项预处理您的代码,或者将源文件扩展名从.fto.F或从.f90to更改为.F90.

于 2011-12-24T14:04:32.040 回答
4

您可以使用 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).

希望这可以帮助。

于 2011-12-24T17:20:55.910 回答
1

按照 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)
于 2011-12-29T16:29:21.377 回答
0

我更喜欢上面 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 操作系统上测试过这个概念。

于 2015-10-04T03:50:10.130 回答