您能告诉我如何获取当前操作系统的文件分隔符,例如Windows中的\
和运行时Fortran中的/
。
答案 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操作系统上测试过这个概念。