以非编译器特定的方式更改Fortran中的目录

时间:2014-11-04 08:42:07

标签: gcc directory fortran intel-fortran

我希望更改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。

1 个答案:

答案 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上的工作方式相同。

(注意:这取决于默认characterc_char相同。这是一个非常安全的假设。如果不是这样,编译器会抱怨并且必须进行转换。 )