File FORTRAN 90如何查找文件夹中的文件数

File FORTRAN 90如何查找文件夹中的文件数,file,fortran,directory,fortran90,File,Fortran,Directory,Fortran90,快速怀疑,我需要读取文件夹中的所有文件,但我不知道有多少文件 我知道如何打开所有文件,只是不知道何时停止,即何时读取所有文件。如果您有生成文件名的特定规则(例如mydata001.dat、mydata002.dat等),那么您可以在每次生成文件名时,使用inquire语句检查文件是否存在。当它第一次不存在时,您可以停止。以下程序说明: program proba implicit none character(len=20) :: buffer logical :: exist

快速怀疑,我需要读取文件夹中的所有文件,但我不知道有多少文件


我知道如何打开所有文件,只是不知道何时停止,即何时读取所有文件。

如果您有生成文件名的特定规则(例如mydata001.dat、mydata002.dat等),那么您可以在每次生成文件名时,使用
inquire
语句检查文件是否存在。当它第一次不存在时,您可以停止。以下程序说明:

program proba
  implicit none

  character(len=20) :: buffer
  logical :: exist
  integer :: ind

  ind = 1
  fileloop: do
    write(buffer,"(A,I3.3,A)") "mydata", ind, ".dat"
    inquire(file=buffer, exist=exist)
    if (.not. exist) then
      write(*,*) "File '", trim(buffer), "' not found, exiting loop"
      exit
    end if
    write(*,*) "File: '", trim(buffer), "' found."
    ind = ind + 1
  end do fileloop

end program proba
或者,如果无法根据规则生成文件名,您可以使用一些库,这些库可以获取目录中的文件列表。一种可能是my library,您可以通过以下方式对任意目录内容执行此操作:

program test_ls
  use filesys_module

  type(dirdesc) :: dir
  character(:), allocatable :: path

  call opendir("./", dir)
  path = dir%next_filename()
  do while (len(path) > 0)
    write(*, "(A)") path
    path = dir%next_filename()
  end do

end program test_ls

如果您有生成文件名的特定规则(例如mydata001.dat、mydata002.dat等),那么您可以在每次生成文件名时,使用
inquire
语句检查文件是否存在。当它第一次不存在时,您可以停止。以下程序说明:

program proba
  implicit none

  character(len=20) :: buffer
  logical :: exist
  integer :: ind

  ind = 1
  fileloop: do
    write(buffer,"(A,I3.3,A)") "mydata", ind, ".dat"
    inquire(file=buffer, exist=exist)
    if (.not. exist) then
      write(*,*) "File '", trim(buffer), "' not found, exiting loop"
      exit
    end if
    write(*,*) "File: '", trim(buffer), "' found."
    ind = ind + 1
  end do fileloop

end program proba
或者,如果无法根据规则生成文件名,您可以使用一些库,这些库可以获取目录中的文件列表。一种可能是my library,您可以通过以下方式对任意目录内容执行此操作:

program test_ls
  use filesys_module

  type(dirdesc) :: dir
  character(:), allocatable :: path

  call opendir("./", dir)
  path = dir%next_filename()
  do while (len(path) > 0)
    write(*, "(A)") path
    path = dir%next_filename()
  end do

end program test_ls

第二种情况是我所处的位置。我会尝试使用你的图书馆,谢谢。与此同时,我正在寻找另一种解决方案,我正在考虑使用系统(命令)来获取使用linux命令的文件列表,但在确定我拥有的编译器的正确语法时遇到了困难。这将是一种非标准解决方案,因为它是您的编译器提供的语言扩展。Fortran 2008有
execute\u命令行
例程,您的编译器可能已经实现了该例程。但是,即使这样,也无法直接提供文件列表…典型的call system()not execute_命令行也无法返回输出,因此您需要执行一些难看的操作,例如将目录列表定向到临时文件,然后打开并读取该文件。您是对的,乔治,这是我选择的解决方案。让我更好地解释一下,程序必须读取一些文件才能运行,这些文件都是由用户提供的,程序也不知道它的名称或数量。将文件作为参数传递的解决方案是什么?如果你有1000个文件,这是一个好的解决方案吗?第二种情况就是我所处的位置。我会尝试使用你的图书馆,谢谢。与此同时,我正在寻找另一种解决方案,我正在考虑使用系统(命令)来获取使用linux命令的文件列表,但在确定我拥有的编译器的正确语法时遇到了困难。这将是一种非标准解决方案,因为它是您的编译器提供的语言扩展。Fortran 2008有
execute\u命令行
例程,您的编译器可能已经实现了该例程。但是,即使这样,也无法直接提供文件列表…典型的call system()not execute_命令行也无法返回输出,因此您需要执行一些难看的操作,例如将目录列表定向到临时文件,然后打开并读取该文件。您是对的,乔治,这是我选择的解决方案。让我更好地解释一下,程序必须读取一些文件才能运行,这些文件都是由用户提供的,程序也不知道它的名称或数量。将文件作为参数传递的解决方案是什么?如果你有1000个文件,这是一个好的解决方案吗?如果你想让一个程序在一堆文件上运行,通常的方法是在运行程序时在命令行上把文件作为参数传递。当然,你的问题变成了如何处理命令行参数。如果你想让一个程序在一堆文件上运行,通常的方法是在运行程序时在命令行上把这些文件作为参数传递。当然,您的问题变成了如何处理命令行参数。。