3

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

+0

“当前操作系统的路径分隔符”?那是什么? – Rook 2011-12-24 13:50:10

+0

编辑当前操作系统 - 程序运行的操作系统 – 2011-12-24 16:35:23

+0

啊,当然..... – Rook 2011-12-24 16:42:54

回答

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

您是否需要从PATH环境变量中读取99999个字符才能提取第一个字符? – Chris 2012-01-08 12:50:37

+0

@Chris +1号当我不得不假设长度(例如,我不知道在Windows中看起来是什么样子)时,我会选择任意长。我相信99的长度会很好。 – milancurcic 2012-01-08 14:58:23

+0

@Chris另外,请注意99999个字符不会被实际读取。程序会读取路径的长度。其余的只会留在记忆中。 – milancurcic 2012-01-08 15:00:23

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解决方案更容易,这些解决方案像其他答案所暗示的那样检查特定的环境变量。

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

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

+0

我没有成功。我有错误,这是非法的预处理器指令。我使用gfortran编译器 – 2011-12-24 23:47:43

+0

您必须对文件进行prerosrosses。将您的文件扩展名从.f更改为.F或从.f90更改为.F90。或者,如果您使用的是intel编译器,则可以在使用这些预处理器编译文件时使用-fpp标志。 – Chris 2011-12-27 17:58:11

+0

@Sergey对不起,刚注意到你说你正在使用gfortran。要调用预处理器,请使用-cpp标志。 – Chris 2011-12-27 18:05:13

1

继IRO-BOT的建议,你可以做一个新的环境变量,例如

export DELIMITER='/' 
在UNIX

现在使窗口对应的变量,只要用“\”,你是好去。

如果你不想在Windows中设置一个全局变量,或者没有权利这样做,放在一个.bat文件

set DELIMITER=\ 

以下更多关于设置,见http://www.ss64.com/nt/set.html 使用set时,您可能必须从CMD运行fortran程序。

Finaly把你的Fortran文件下列

CHARACTER :: delimiter 
CALL get_environment_variable('DELIMITER',delimiter) 
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操作系统。

+1

你能解释一下这个修改是什么吗?您提及的答案并不明显。 – francescalus 2015-10-04 19:37:44