使用隐式 do 循环写入文件

Write to file using an implicit do loop

我需要有关 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 的名称。 有什么方法可以让它们的值也保留在声明部分吗?

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

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 指出这一点]。