2016-07-25 123 views
0

我想从Fortran中的某些文件读取数据,当文件名具有正常顺序时,我可以这样做。但现在它不是固定的,虽然所有的前缀都是相同的:Fix001,Fix002,Fix023,Fix432,...如何在fortran中打开所有具有特定扩展名(前缀名)的文件?

我想让程序从用户处获取前缀并打开循环中的所有文件,数据并将它们写入单个文件。 有什么想法? 谢谢。

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 
+0

FYI'整数:: N = 5'不等同于'整数::Ñ ; n = 5'但是是整数,保存:: n = 5'。这让很多新的Fortraners感到惊讶。 – jlokimlin

+0

坦白,我不知道,但现在它仍然有效;) –

+0

你看到该程序的特定问题是什么? – francescalus

回答

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 
+0

由于OP使用gfortran,我建议使用'newunit'说明符而不是硬编码文件单元标识符。 – jlokimlin

+0

我不确定'newunit'声明有多'新'。他问F77到F95 - 所以我不想做任何超出这个范围的事情。 – chw21

+1

对于那些使用没有'newunit'支持的编译器,您可能希望查看http://fortranwiki.org/fortran/show/newunit,以获取可在编译器更新之前使用的用户实现。 –

相关问题