如何在 fortran 中打开所有具有特定扩展名(名称前缀)的文件?
How to open all files with some specific extension(prefix in name) in fortran ?
我想从一些 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
如果您确实有上限,您可以尝试打开文件并使用 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
我想从一些 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
如果您确实有上限,您可以尝试打开文件并使用 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