在Fortran中,可以选择使用隐含循环。它们通常用于印刷,具有以下结构。
write(*,'(5I6)') (i,i=1,20)
! output
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
这将允许写入5个宽度为6的整数,完成后,自动进入下一行。因此,它对格式化非常有用。
问题是这是否可以反向进行
read(*,'(5I6)') (a(i),i=1,20)
由于每行只有5个元素,因此这当然不起作用。我想问一下如何在自动模式下翻到下一行。我正在计算参赛作品的数量,一旦达到5,我就转到下一行。另一种选择是在二进制临时文件中读取文件,其中不存在“新”行。这不适合我,因为我使用index()
函数搜索关键字。
答案 0 :(得分:1)
如果你出于某种原因真的需要这种格式,我会这样做
do i = 1, n, 5
read(*,'(5I6)') a(i:i+4)
end do
否则列表导向格式将按照High Performance Mark的建议运行良好。
你可以把它写成隐含的,但子数组更好。
我甚至可以想象一个包含/
格式描述符的单行,但为什么要这么麻烦?
(评论太长了)
答案 1 :(得分:1)
格式化还原是这里的关键术语。它适用于输出和输入。
在进一步研究之前,隐含的做法基本上是无关紧要的,所以我将坚持使用整个数组的数据传输语句。这对于第一个输出也是如此,它可能也是一个值为1到20而不是隐含的数组(试一试!)。所以,
read (*,fmt) a
就像
read (*,fmt) (a(i),i=1,20)
当a
有这些界限时。
对于输出,“自动到下一行”是处理输出的一部分,格式为reversion。一旦格式项已经用尽并且还有更多要写出的项目,我们将回到格式的开头。我们也进入下一个记录的开始。在这种情况下,这是新线的开始。这给出了输出
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
在二十分之后的每五个项目之后我们开始新的一行。
阅读时格式返回相同。给定
read(*,'(5I6)') a
根据格式的a
部分传输5I6
的五个元素。此时,格式项列表已用尽,并且格式返回发生。回到格式的开头,然后到下一条记录。
结束
read(*,'(5I6)') a
与
相反write(*,'(5I6)') a