Fortran 打开部分名称已知的文件

Fortran 打开部分名称已知的文件,fortran,fortran90,Fortran,Fortran90,我必须 open(unit,file='x',status='old',action='read',iostat=io_error) 问题是,我只知道文件名的一部分,因为最后一部分是一个数字,每次程序执行时都会更改,我不知道生成该数字的系统(extern库) 有没有办法在只知道文件名一部分的情况下打开该文件?不幸的是,您需要知道文件名才能打开它。Fortran在这方面缺少的一点是检查文件系统的能力。你的选择归结为 执行命令行或系统调用外部程序,或 使用iso_c_binding功能调用c标准

我必须

open(unit,file='x',status='old',action='read',iostat=io_error)
问题是,我只知道文件名的一部分,因为最后一部分是一个数字,每次程序执行时都会更改,我不知道生成该数字的系统(extern库)


有没有办法在只知道文件名一部分的情况下打开该文件?

不幸的是,您需要知道文件名才能打开它。Fortran在这方面缺少的一点是检查文件系统的能力。你的选择归结为

  • 执行命令行
    系统
    调用外部程序,或
  • 使用
    iso_c_binding
    功能调用c标准库函数
我发现第二个选项有点麻烦,因为您需要进行的调用涉及很多typdef'd类型、结构和C指针。这当然是可行的,但如果您还不熟悉Fortran/C互操作,它就不是最简单的

调用
execute\u command\u line
system
更容易,因为如果您可以编写一个shell命令来查找文件名,那么您已经有了解决方案

例如,我有一个库,它读取包含N个文件的HDF5数据,其中N基于模型时间步长,可能是不规则的。我没有让用户承担枚举文件的负担,而是处于与您类似的位置。我解决问题的方法是这样的:

character(len=*), parameter :: temporary_file = '/tmp/something_unique'
character(len=*) :: filename_fragment, filename
integer :: u

call execute_command_line('find . -name '//trim(filename_fragment)// &
                          "* -printf '%f\n' > "//trim(temporary_file)
open(newunit=u, file=temporary_file, action="read")
read(u, '(A)') filename
close(u)
如果
filename\u fragment
是您知道的名称的一部分,那么这只不过是调用
find
,并重定向输出。例如,如果文件名_片段为“datasetABC_u”,则会运行此命令

find . -name 'datasetABC_*' -printf '%f\n' > /tmp/something_unique
文件
/tmp/something\u unique
每行包含一个与搜索匹配的文件名。您可能需要将参数调整为
find
,以适用于您的特定情况,但这将为您提供如何继续的总体思路。一旦你有了这个工作,你只需打开
/tmp/something_unique
并从文件中读取你的完整文件名,现在你知道了打开它们的完整名称


*注意:上述解决方案假定您的
查找将只返回一个文件名。如果它有多个匹配项,则需要优化搜索或在Fortran中处理该情况,以便从临时文件中的文件名中获得正确的文件。

不是在纯Fortran中。您必须使用其他方法来搜索目录中的文件。可能是用贝壳做的。你使用哪种操作系统?Ubuntu。你指的是类似系统的东西吗?是的,是系统还是执行命令行,这是标准语句。创建一些bash脚本,它将确定正确的名称并将其保存在某处。然后读取保存在Fortran中的文件名。或者,可能更简单,使用一个shell包装器,首先标识文件,然后调用Fortran程序,将所选文件名作为参数传递。或者你可以创建一个符号链接(甚至是硬链接),在每次运行时用一个固定的名称指向所需的文件,Fortran使用这个固定的名称。非常感谢你的回答,我明天会查看它。因为我已经在使用iso_c_绑定(外部库是c/c++的),所以它甚至没有那么难。明天见。
execute\u命令行('find…
在第一次尝试时运行良好!非常感谢!