fortran - 使用隐式 do 循环写入文件

标签 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='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 指出这一点]。

关于fortran - 使用隐式 do 循环写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957221/

相关文章:

fortran - 零大小的数组和数组边界检查

compiler-errors - 系统找不到指定的文件-在SciTE中编译

Fortran 按引用传递 按值传递作业

fortran 1.0D0,需要 D0 或编译失败

python - 使用 Python 将数组写入二进制文件,然后使用 Fortran 读取

fortran - Fortran 中结果变量的用途是什么?

matlab - 非等距数据的一维高斯滤波器

fortran - 派生类型访问器函数的跨模块内联

debugging - Gfortran:将所有 block 视为 block

types - 使用 gfortran 强制显式变量声明