格式化读取和暗示

时间:2016-10-12 13:04:09

标签: fortran

在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()函数搜索关键字。

2 个答案:

答案 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