如何使用Fortran检测具有典型扩展名的文件是否存在

时间:2015-09-05 11:33:59

标签: fortran

我的问题是这样的, 假设有一个名为'Input'的文件夹包含一些文件。这些文件的名称类似于* .nod,* .elem等。文件名的主要部分由最终用户提供。 现在,我想检测文件夹中是否存在任何* .nod并获取文件名的主要部分以生成一些输出文件。

例如,如果有test.nod。首先,我想检测这个文件是否存在。如果是,我需要获得字符'test',并使用它来命名输出文件,例如'test.rst'

我没有在互联网上找到任何解决此问题的方法。

2 个答案:

答案 0 :(得分:1)

在Rosettacode.org找到:

LOGICAL :: file_exists
INQUIRE(FILE="input.txt", EXIST=file_exists)   ! file_exists will be TRUE if the file
                                               ! exists and FALSE otherwise
INQUIRE(FILE="/input.txt", EXIST=file_exists)    

编辑:

CHARACTER(10) :: extension="nod"
CHARACTER(255) :: cfile

IF(os == "unix") THEN
CALL system('ls -1 *.'//TRIM(extension)//'> list')
ELSE
CALL system('dir /b/on *.'//TRIM(extension)//'> list')
ENDIF

打开并阅读文件list,格式为"(A)" e.g。

OPEN(15,file="list")    
READ(15,"(A)",END=10) cfile

答案 1 :(得分:1)

如果您使用的是Linux,则可以使用system命令和basename命令来执行此操作。这里,获取的基本名称保存在“_tmp_”中,然后读入字符串。

    character(50) :: base
    logical :: ok

    call system( "cd input; rm -f _tmp_; [ -f *.nod ] && basename *.nod .nod > _tmp_" )

    inquire( file="input/_tmp_", exist=ok )
    if ( ok ) then
        open( 10, file="input/_tmp_", status="old" )
        read( 10, * ) base
        close( 10 )
        print *, "basename = ", trim(base)
    else
        stop "*.nod not found :("
    endif

    ! open( 20, file=trim(base) // ".rst" )    ! open new files

如果有许多* .nod文件并且需要提取所有基本名称,那么做这样的事情可能会有用(感谢@Vladimir和@RolfofSaxony):

!> A pattern using for loops in the shell script.
! call system( "cd input; rm -f _tmp_; for f in *.nod; do basename -s .nod $f >> _tmp_; done" )

!> Another pattern using -s option for basename command.
! call system( "cd input; rm -f _tmp_; basename -s .nod *.nod > _tmp_" )

如果您的编译器足够新,您可以在Fortran2008(Ref)中使用execute_command_line,这是system的标准化版本,并使代码更具可移植性:

call execute_command_line( "...." )