在Fortran中获取文件分隔符

时间:2011-12-24 13:35:27

标签: operating-system fortran environment-variables path-separator

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

4 个答案:

答案 0 :(得分: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)中寻找“\”。

希望这有帮助。

答案 1 :(得分: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子句。这比引入picemeal解决方案更容易,picemeal解决方案检查特定的环境变量,如其他答案所示。

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

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

答案 2 :(得分:1)

根据IRO-bot建议,您可以创建一个新的环境变量,例如

export DELIMITER='/'

in unix

现在在windows中创建一个相应的变量,只需要'\',你就可以了。

如果您不想在Windows中设置全局变量,或者无权执行此操作,请将以下内容放在.bat文件中

set DELIMITER=\

有关集合的更多信息,请参阅http://www.ss64.com/nt/set.html 使用set时,您可能必须从CMD运行fortran程序。

最终将以下内容放入您的fortran文件中

CHARACTER :: delimiter
CALL get_environment_variable('DELIMITER',delimiter)

答案 3 :(得分: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操作系统上测试过这个概念。