Fortran 使用隐式do循环写入文件

Fortran 使用隐式do循环写入文件,fortran,fortran90,gfortran,fortran2003,Fortran,Fortran90,Gfortran,Fortran2003,我需要一个关于Fortran中隐式do循环的帮助。 这是我的简单代码: Program Simple Implicit none Integer::i,j Integer,parameter::N=2,M=3 Real,dimension(N,M)::Pot Open(1,File='First.txt',Status='old') Read(1,'(M(f3.1,1x))') ((Pot(i,j),j=1,M),i=1,N) Close(1) Open(2,File='Se

我需要一个关于Fortran中隐式do循环的帮助。 这是我的简单代码:

Program Simple

Implicit none

Integer::i,j
Integer,parameter::N=2,M=3
Real,dimension(N,M)::Pot

Open(1,File='First.txt',Status='old')

    Read(1,'(M(f3.1,1x))') ((Pot(i,j),j=1,M),i=1,N)

Close(1)

Open(2,File='Second.txt',Status='Unknown')

    Write(2,'(M(i0,1x,i0,1x,f3.1,1x))') ((i,j,Pot(i,j),j=1,M),i=1,N)

Close(2)

Stop
End program Simple
这是文件
First.txt

1.1 1.2 1.3
2.1 2.2 2.3
当我尝试执行此程序时,收到以下消息:

Unexpected element 'N' in format string
Unexpected element 'M' in format string
我想在write语句中保留整数变量N和M的名称。
还有什么方法可以从声明部分保留它们的值吗?

您在字符串中使用的是
M
N
(作为字符),而不是作为变量。要使用变量,需要将其值写入格式字符串:

character(len=128) :: fmtString
!...
write(fmtString,*) M
fmtString = '('//trim(adjustl(fmtString))//'(f3.1,1x))'
Read(1,fmtString) ((Pot(i,j),j=1,M),i=1,N)
对于
write
语句也是如此

但是,您可能可以使用列表定向输入(
Read(1,*)
)进行输入,并让Fortran计算出确切的格式


您可以在现代编译器中使用
(*(f3.1,1x))
,而不是这种字符串操作,或者如果您使用的是旧编译器,则只需指定一个非常大的数字,例如
(99999(f3.1,1x))
。在这两种情况下,将打印正确数量的值。但是,这将导致在一行中写入所有
m*n
值[感谢@agentp指出这一点]

在这种情况下,简单地使用*将把所有
m*n
值放在一行,我认为这很有帮助!正确的表格在问题中。@JohnCorn请不要这样做。如果你像这样编辑你的问题,没有人会理解它了。