在Fortran程序中,我需要将数组写入具有特定格式的文件中。我完全适用于较小的数组(例如,下例中的alen=10),但不适用于较大的数组:然后它将每行拆分为两行,就好像超过了每行的最大字符数一样。
示例(与我的程序中的结构非常相似):
PROGRAM output_probl
IMPLICIT NONE
INTEGER, PARAMETER :: alen=110
DOUBLE PRECISION, DIMENSION(alen)::a
INTEGER :: i,j
OPEN(20,file='output.dat')
30 format(I5,1x,110(e14.6e3,1x))
DO i=1,15
DO j=1,alen
a(j)=(i*j**2)*0.0123456789
ENDDO
write(20,30)i,(a(j),j=1,alen)
ENDDO
END PROGRAM output_probl
它可以正确编译和运行(使用Compaq Visual Fortran)。只是输出文件是错误的。例如,如果我将每个数组项的字段宽度从14更改为8,它会很好地工作(这当然不是一个令人满意的解决方案)。我考虑了一个不合适的默认最大记录长度,但找不到如何更改它(即使使用RECL,它似乎也不起作用——如果你认为应该的话,欢迎使用RECL的具体示例)。
这可能是基本的,但我已经坚持了一段时间。。。欢迎任何帮助,非常感谢!
为什么不进行流访问?对于sequential,总是存在一些与处理器相关的记录长度限制。
PROGRAM output_probl
IMPLICIT NONE
INTEGER, PARAMETER :: alen=110
DOUBLE PRECISION, DIMENSION(alen)::a
INTEGER :: i,j
OPEN(20,file='output.dat',access='stream', form='formatted',status='replace')
30 format(I5,1x,110(e14.6e3,1x))
DO i=1,15
DO j=1,alen
a(j)=(i*j**2)*0.0123456789
ENDDO
write(20,30)i,(a(j),j=1,alen)
ENDDO
END PROGRAM output_probl
注意,我将使用一个字符变量作为格式字符串,或者将其直接放在write语句中,而不是带有标签的FORMAT
语句。
Fortran 95版本:
PROGRAM output_probl
IMPLICIT NONE
INTEGER, PARAMETER :: alen=110
DOUBLE PRECISION, DIMENSION(alen)::a
INTEGER :: i,j,rl
character(2000) :: ch
inquire(iolength=rl) ch
OPEN(20,file='output.dat',access='direct', form='unformatted',status='replace',recl=rl)
30 format(I5,1x,110(e14.6e3,1x))
DO i=1,15
DO j=1,alen
a(j)=(i*j**2)*0.0123456789
ENDDO
write(ch,30)i,(a(j),j=1,alen)
ch(2000:2000) = achar(10)
write(20,rec=i) ch
ENDDO
END PROGRAM output_probl
下面的程序应该进行测试。使用Absoft编译器,它可以很好地处理n=10000个10个字符的单词,也就是说,总共有一行100000个字符宽(加上一对)。对于G95,我收到一条消息"没有足够的存储空间来处理此命令",n=5000(n=4000工作)。character*10,维度(:),可分配::测试integer,维度(:),可分配::itest
1写入(,)"输入n>0"读取,n如果(n.le.0),则write(,)'要求值n>0'转到1endifwrite(,*)'n=',n分配(测试(n),itest(n))
write(test,'((i10))')(i,i=1,n)
write(*,*)test
open(10,file='test.txt')
write(10,*)test
write(*,*)'file test.txt written'
close(10)
open(11,file='test.txt')
read(11,*)itest
write(*,*)itest
end