使用无限制格式项时的无关输出

问题描述 投票:1回答:1

这是我的代码:

Program Output_Format

Implicit none

Integer::k
Integer,parameter:: Br_nn_mre = 5
Character(56),parameter:: FMT_01 = '(1x,"NN_DM:",1x,*("NN_",i2.2,1x))'

Open( 15 , File = 'Output.txt' , Status = 'Unknown' , Action = 'Write' )

  Write( 15 , FMT_01 ) ( k , k = 1 , Br_nn_mre )

Close( 15 , Status = 'Keep' )

End Program Output_Format

Output.txt文件的内容是:

NN_DM: NN_01 NN_02 NN_03 NN_04 NN_05 NN_

我想在Output.txt中获取此内容:

NN_DM: NN_01 NN_02 NN_03 NN_04 NN_05

也就是说,没有落后的NN_

*FMT_01格式有什么问题?例如,如果我用5代替*,我会得到我想要的。如何使用无限重复计数仍能获得所需的输出?我不会总是知道重复多少次。

fortran gfortran
1个回答
2
投票

这与格式的处理方式有关,特别是在数据传输语句终止时。

对于您拥有的输出语句,传输在以下任何一种情况下终止:

  • 到达数据编辑描述符,输出列表中没有剩余元素;要么
  • 达到最后的右括号,输出列表中没有剩余的元素。

在你的格式

'(1x,"NN_DM:",1x,*("NN_",i2.2,1x))'

'(1x,"NN_DM:",1x,5("NN_",i2.2,1x))'

单个数据编辑描述符有i2.21xs是控制编辑描述符,"NN_DM""NN_"是字符串编辑描述符。

让我们来看看在5作为重复计数的情况下如何处理格式。格式1x,"NN_DM:",1x的第一部分处理没有问题,输出NN_DM:将我们移动到5("NN_",i2.2,1x))。对应于这个重复的片段是五个数据项,因此它们被处理(给出输出NN_01 NN_02 NN_03 NN_04 NN_5)。

重要的是接下来会发生什么。完成此5(..)部分后,我们到达格式规范的最后一个右括号,并且没有剩余的输出项,因此格式的处理结束。

*(..)案件有什么不同?

好吧,当我们到达*(..)的尽头时,我们回到那个重复格式的开始;我们不会转到最后的右括号。这使我们处理编辑描述符,直到我们到达数据编辑描述符。这意味着在我们注意到输出的数据项之外,处理"NN_"(导致输出NN_)。

来修复:使用冒号编辑描述符。冒号编辑描述符的作用类似于数据编辑描述符,因为如果没有剩余的数据项,格式处理会立即终止。

Character(56),parameter:: FMT_01 = '(1x,"NN_DM:",1x,*("NN_",i2.2,:,1x))'

就个人而言,我会写这个

Character(*),parameter:: FMT_01 = '(" NN_DM:",*(" NN_",i2.2,:))'

1如果我们将6作为重复计数,这将没有什么不同; *并不特别,只是它是一个“非常大的重复计数”。

© www.soinside.com 2019 - 2024. All rights reserved.