回 帖 发 新 帖 刷新版面

主题:获取*.f文件自身的名称

RT,请教如何在fortran中获取*.f文件自身的名称?

我试过GetFileInfoQQ
GetFileInfoQQ对目录下只有一个*.f文件是可行的,
对多个*.f文件就不好处理了。

回复列表 (共3个回复)

沙发

请注意,Fortran 是编译型语言,编译之后,成为目标代码。

目标代码将会完全脱离源代码,脱离编译器而运行。是独立的可执行程序。

这是 Fortran 编程的目标。为什么你还要返过来找源代码呢?

如果用 GetFileInfoQQ,是可以获得多个文件的。可能你没用好。

[quote]Program Main
  Implicit None
  Integer n
  call DoWithWildcard( '*.f*' , show , n )
  
Contains

  Subroutine Show( cFile , iLoop )
    Character( Len = * ) , Intent( IN ) :: cFile
    Integer , Intent( IN ) :: iLoop
    Write( * , * ) cFile
  End Subroutine Show
End

Subroutine DoWithWildcard(cWildcard,CallBack,iTotal)
  Use IFPort , only : GetFileInfoQQ , GetLastErrorQQ , FILE$INFO , FILE$LAST , FILE$ERROR , FILE$FIRST , ERR$NOMEM , ERR$NOENT , FILE$DIR
  Implicit None
  Interface 
    Subroutine CallBack( cFile , iLoop )
      Character( Len = * ) , Intent( IN ) :: cFile
      Integer , Intent( IN ) :: iLoop
    End Subroutine CallBack
  End Interface
  Character( Len = * ) , Intent( IN ) :: cWildcard
  Integer , Intent( OUT ) :: iTotal
  Type (FILE$INFO) :: stInfo
  Integer(4) :: iWildhandle , iLength , iRet
  iWildhandle = FILE$FIRST
  iTotal = 0
  Do While (.TRUE.)
      iLength = GetFileInfoQQ( cWildCard , stInfo , iWildhandle )
      If (( iWildhandle == FILE$LAST) .OR.( iWildhandle == FILE$ERROR )) then
        Select Case (GetLastErrorQQ())
        Case (ERR$NOMEM)  !//内存不足
          iTotal = - 1
          return
        Case (ERR$NOENT)  !//碰到通配符序列尾
          return
        Case Default
          iTotal = 0
          return
        End Select
      End If
      If ( ( stInfo%permit.AND.FILE$DIR ) == 0 ) then
        call CallBack( Trim(stInfo%Name) , iTotal + 1 )
        iTotal = iTotal + 1
      End If
  End Do
End Subroutine DoWithWildcard[/quote]

板凳

@臭石头雪球:
你的回复中包含了一些对fortran的深刻认识,受教了,多谢。

我之所以要获取*.f文件本身的名称是由于我写的fortran是供其他软件调用的子程序。
该软件调用fortran子程序后,会生成“子程序_job.ext”形式的文件。
我需要来判断这个“子程序_job.ext”文件是否存在,所以就要用到*.f文件本身的名称。

通过GetFileInfoQQ当然是能够实现的,但对同文件夹下有多个*.f文件处理就不方便了。
故到论坛上来请教更直接的方法,
如果有直接方法,那就再好不过了;
没有,用GetFileInfoQQ也尚可接受。


3 楼

我给出的代码可以实现,多个 .f 文件。请认真阅读。

我来回复

您尚未登录,请登录后再回复。点此登录或注册