0

在 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 的具体示例)。

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

4

2 回答 2

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
于 2013-02-07T12:40:00.483 回答
0

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

1 write( , )'Enter n > 0' read , n if(n.le.0) then write( , )'requires value n > 0' go to 1 endif write( ,*)'n=',n allocate (测试(n),测试(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
于 2014-07-11T15:17:09.397 回答