我必须
open(unit,file='x',status='old',action='read',iostat=io_error)
问题是,我只知道文件名的一部分,因为最后一部分是一个数字,每次执行程序时都会改变,我不知道生成数字的系统(外部库)
有没有办法打开文件只知道名称的一部分?
答案 0 :(得分:1)
不幸的是,您需要先知道文件名才能打开它。 Fortran在这方面缺少的一件事是能够检查文件系统。您的选择归结为
EXECUTE_COMMAND_LINE
或SYSTEM
来调用外部程序,或iso_c_binding
功能调用C标准库函数。我觉得第二个选项有点麻烦,因为你需要做的调用涉及很多typdef类型,结构和C指针。如果您还不熟悉Fortran / C互操作,那肯定是可行的,但不会是最直接的。
如果您可以编写shell命令来查找文件名,那么调用execute_command_line
或system
会更“容易”,那么您已经有了解决方案。
作为一个例子,我有一个库,用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_fragment
是您知道的名称的一部分,这只不过是调用find
并重定向输出。例如。如果filename_fragment是“datasetABC_”,则会运行
find . -name 'datasetABC_*' -printf '%f\n' > /tmp/something_unique
文件/tmp/something_unique
每行包含一个与您的搜索匹配的文件名。您可能需要调整find
的参数以适用于您的特定情况,但这可以让您大致了解如何继续。一旦你有了这个工作,你只需打开/tmp/something_unique
并从文件中读取你的完整文件名,现在你知道打开它们的全名。
*注意:上述解决方案假设您的find
只返回一个文件名。如果它有多个匹配项,您需要优化搜索或在Fortran中处理该情况,以便从临时文件中的文件名中获取正确的文件。