我希望更改Fortran 90代码中的工作目录。是否可以以非编译器特定的方式执行此操作?这是我的代码:
program change_directory
integer :: ierr
call system("mkdir -p myfolder/")
!call system("cd myfolder/") !doesn't work
ierr = chdir("myfolder")
if (ierr.NE.0) then
write(*,'(A)') "warning: change of directory unsuccessful"
end if
open(unit=33,file="myfile.txt",iostat=ierr)
if (ierr.EQ.0) then
write(unit=33,fmt='(A)') "Test message"
close(unit=33)
end if
end program change_directory
显然,在系统调用中使用cd myfolder/
不起作用。 Intel reference说我需要添加“use ifport
”。但是GCC reference中没有这样的提及。退出“use ifport
”,我可以毫不费力地编译ifort
下的上述代码。然而,当我把它放入时,它不会用gcc编译(因为gcc没有ifport
模块) - 不仅如此,它也不会在Intel Fortran下编译 - 我'我收到以下错误:
$ ifort change_dir.f90 -o change_dir
change_dir.f90(5): error #6552: The CALL statement is invoking a function subprogram as a subroutine. [SYSTEM]
call system("mkdir -p myfolder/")
---------^
compilation aborted for change_dir.f90 (code 1)
所以我的问题如下:有更好的方法吗?我想保持我的代码尽可能与编译器无关。目前,我主要使用gfortran / ifort和mpif90 / mpiifort。
答案 0 :(得分:1)
另见Is there any way to change directory using C language?。您可以创建自己的chdir()
POSIX call界面,使其独立于英特尔的界面。在Windows上它是类似的。
module chdir_mod
implicit none
interface
integer function c_chdir(path) bind(C,name="chdir")
use iso_c_binding
character(kind=c_char) :: path(*)
end function
end interface
contains
subroutine chdir(path, err)
use iso_c_binding
character(*) :: path
integer, optional, intent(out) :: err
integer :: loc_err
loc_err = c_chdir(path//c_null_char)
if (present(err)) err = loc_err
end subroutine
end module chdir_mod
program test
use chdir_mod
call chdir("/")
call system("ls -l")
end
并且在运行时
> gfortran chdir.f90
> ./a.out
celkem 120
drwxr-xr-x 2 root root 4096 15. říj 14.42 bin
drwxr-xr-x 5 root root 4096 15. říj 14.43 boot
...
在ifort
上,它的工作方式与sunf90
上的工作方式相同。
(注意:这取决于默认character
与c_char
相同。这是一个非常安全的假设。如果不是这样,编译器会抱怨并且必须进行转换。 )