【问题标题】:How to open all files with some specific extension(prefix in name) in fortran ?如何在 fortran 中打开具有特定扩展名(名称中的前缀)的所有文件?
【发布时间】:2016-07-25 22:53:44
【问题描述】:

我想从 Fortran 中的某些文件中读取数据,当文件名具有规则顺序时,我可以这样做。但现在它不规则了,尽管它们都有相同的前缀,例如:Fix001、Fix002、Fix023、Fix432、...

我希望程序从用户那里获取前缀并循环打开所有文件,读取数据并将它们写入单个文件。 任何的想法 ? 谢谢。

PROGRAM Output
Implicit none
Integer ::n=5        !number of files
Integer ::nn=50  !number of rows in each file
Integer ::i,j
Real,Dimension(:),Allocatable::t,x,y,z
Character(len=12)::TD 

Open(11,file='outputX.txt')
Allocate (t(1000),x(1000),y(1000),z(1000)) 

 j=0
Do i=1,n
    Write(TD,10)i 
    Write(*,*)TD 
    Open(1,file=TD) 
        Read(1,*)(t(j),x(j),j=1,nn)
        Write(11,20)(x(j),j=1,nn)
 j=j+1
Enddo

10  Format('100',i3.3,'') 
20 Format(<nn>E25.8E3)

 Deallocate(x,y,z,t) 
 END PROGRAM Output

【问题讨论】:

  • 仅供参考 integer :: n = 5 不等于 integer :: n; n = 5 而是 integer, save :: n = 5。这让很多 Fortran 新手感到惊讶。
  • 承认,我不知道,但现在它仍然有效;)
  • 您在该程序中看到的具体问题是什么?
  • 你真的不需要所有这些语言标签,特别是你的代码不是 Fortran 77。如果你有一个特定的语言版本需要定位,你可以明确提及。甚至 Fortran 95 也被淘汰了。
  • 这没有问题并且可以工作,但是直到文件编号按顺序排列,我的意思是例如它读取文件:Fix001、Fix002、Fix003...但是如果这个顺序破坏了某些程序将关闭。

标签: fortran fortran90 gfortran fortran77 fortran95


【解决方案1】:

如果确实有上限,可以尝试打开文件,用iostat参数测试是否成功。如果不是,则跳过该文件。

这是一个仅从文件中读取第一个整数变量并将其附加到输出文件的示例:

program read_files
    implicit none
    integer :: i, d
    integer :: ioerr
    character(len=len("FixXXX.txt")) :: fname

    open(unit=30, file="Output.txt", action="write", iostat=ioerr)
    if (ioerr /= 0) stop 1

    do i = 0, 999
        write(fname, '(A, I3.3, A)') "Fix", i, ".txt"
        open(unit = 40, file=fname, status="old", action="read", iostat=ioerr)
        if (ioerr /= 0) cycle
        read(40, *) d
        write(30, *) d
        close(40)
    end do
end program read_files

【讨论】:

  • 由于 OP 使用 gfortran,我建议使用 newunit 说明符而不是硬编码文件单元标识符。
  • 我不确定newunit 声明有多“新”。他问过 F77 到 F95 的问题——所以我不想做任何超出这个范围的事情。
  • 对于那些使用没有newunit 支持的编译器的人,您可能希望查看fortranwiki.org/fortran/show/newunit 以获取可以在编译器更新之前使用的用户实现。
  • 显然我的代码在这一行之后有问题:if (ioerr /= 0) cycle。因为它被忽略了所有循环。程序一直在正确运行,但没有给出任何输出。我不知道这个newunit 是如何工作的。我要搜索它,但知道我猜这个之前的建议可能对我有用。
  • 我不会太担心那些只使用一堆标签而没有在问题中提到它们是版本限制的用户的版本标签。通常他们对新的可能性知之甚少。但是 newunit 是个小问题,对我来说没问题。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多