Fortran:输出大数组-超出长度,拆分为两行



在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

最新更新