在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的具体示例。)
这可能是基本的,但我已经坚持了一段时间......欢迎任何帮助,非常感谢!
答案 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