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

时间:2013-02-07 12:25:44

标签: 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的具体示例。)

这可能是基本的,但我已经坚持了一段时间......欢迎任何帮助,非常感谢!

2 个答案:

答案 0 :(得分:3)

为什么不进行流访问?顺序存在一些依赖于处理器的记录长度限制。

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

答案 1 :(得分:0)

下面的程序应该测试。使用Absoft编译器,它适用于n = 10000,10个字符的单词,即100000个字符宽的行(加上一对)。使用G95,我收到一条消息"没有足够的存储空间来处理此命令"对于n = 5000(n = 4000工作)。       character * 10,dimension(:),allocatable :: test       整数,尺寸(:),可分配:: ITEST

1写()'输入n> 0'       读,n       if(n.le.0)然后          写()'要求值n> 0'          去1       万一       写(,*)' 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