使用隐式 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 的名称。
有什么方法可以让它们的值也保留在声明部分吗?
您在字符串中使用 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 指出这一点]。
我需要有关 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 指出这一点]。