如何用Fortran批量读取文件

法1

CHARACTER*8 FILENAME(100)
读入数据文件名称
OPEN(10,FILE='INPUT.LIST') ! 文件名组成的数据文件
do L= 1, nfile
read(10,*) FILENAME(L)
enddo
打开数据文件
do L = 1,nfile
open(12,file=FILENAME(L))
read(12,*) .......
enddo

法2

do i=1,number of files
file_name=char(i+48)//'.dat'
file_number=i+100
open(fileid=file_number,file=file_name)
read(fileid=file_number,*) vars
close(fileid)
enddo

需要读取大批量的数据,文件有一定的规律,特别是按照数字的顺序排列的,现给出读取文件名的方法:
简单方法:
Character*40 fname
integer m
do m=1:99999 !数据文件的个数。
write(fname,'(I6)') m
!write(*,*) Trim(AdjustL(fname))
open(m,file= 'D:\helpu\u'//Trim(AdjustL(fname))//'.grd') !路径+文件名
....................
close(m)
enddo
复杂的方法可以是:自己写个子程序,进行自己需要的转换。(略

1. 如何加大Stack size?
选Project => Settings => Link => Category: Output =>
Stack allocations
Reserve: 这里填新值(默认为1M,若需要10M,则填10000000)
2. 如何用Fortran批量生成文件?
设要生成4000个文件,文件名为AA1-AA4000,如何写循环生成文件,而不用写4000次write命令呢?

用内部文件:
character(len=80) :: filename,form
integer :: i

do i=1,4000
select case (i)
case (1:9)
write(form,'(i1)') i
case (10:99)
write(form,'(i2)') i
case (100:999)
write(form,'(i3)') i
case (1000:9999)
write(form,'(i4)') i
end select
write(filename,*) "AA",trim(form),".TXT"
open(10,file=filename)
write(10,*) i
close(10)
end do

stop
end
3. 如何用Fortran动态生成输出格式?
设有一个数组data(100),输出时,希望每行输出num个数,而num由用户输入,如何实现?

用内部文件:
character(len=80) :: form
real :: data(100)
integer :: i,num

data = (/ (i,i=1,100) /)/10.0
read(*,*) num
write(form,*) "(",num,"f10.3)"
write(*,form) data

stop
end
4. 如何用F90/95生成随机数?
注意:
现在计算机产生的随机数都是伪随机数。
random_number(x) 产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。
用了random_seed ()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。

program random
implicit none
real :: x
call random_seed () ! 系统根据日期和时间随机地提供种子
call random_number (x) ! 每次的随机数就都不一样了
write(*,*) x
stop
end program random


01 character(len=80) :: form
02 real :: data(100)
03 integer :: i,num
04
05 data = (/ (i,i=1,100) /)/10.0
06 read(*,*) num
07 write(form,*) "(",num,"f10.3)"
08 write(*,form) data
09
10 stop
11 end
这段代码的功能是一定长度的数组,按一定格式输出,要求每行输出的数字个数可变。其中

,form 就是所谓的内部文件,我们知道 Fortran 的输出格式可以用字符串,这里就是将 num 和输出格式都写到 form 中(因为需要将 num 写入,所以不能直接对字符串赋值,而是将其当做一个文件写入),然后以 form 作为 data 的输出格式。如 num 为 5,form 的值就是 5f10.3,可以在程序里加一句 print*, form 验证。

实际上要实现动态输出还有其他方式,如 CVF 和 IVF 里可以在输出格式里用尖括号扩住变量,如本问题,上面代码里的 7-8 行可以用下面这句来代替

write(*,"(f10.3)") data

但是这种用法不是 Fortran 标准,所以有些编译器并不支持,如 gfortran。

还有一种笨办法,在输出里加上 advance=no 选项


Fortran语言: Codee#11301
1 j=1
2 do while(j<=100)
3 do i=1,num
4 write(*,"(f10.3)",advance='no') data(j)
5 j=j+1
6 if(j>100) exit
7 enddo
8 write(*,*)
9 enddo



相关文档
最新文档