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

时间:2018-01-01 20:01:18

标签: fortran gfortran

这是我的代码:

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_

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

1 个答案:

答案 0 :(得分:2)

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

对于您所拥有的输出语句,传输在以下任何一个时终止:

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

以您的格式

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

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

单个数据编辑描述符有i2.21x是控件编辑描述符,"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(..)部分后,我们到达格式规范的最后一个右括号,并且没有剩余的输出项,因此格式的处理结束。

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

好吧,当我们到达*(..)的末尾时,我们会回到那个重复格式的开头;我们不会转到最后的右括号。 1 这使我们处理编辑描述符,直到我们到达数据编辑描述符。这意味着在我们发现输出数据项不足之前,会处理"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作为重复计数,这将没有什么不同; *并不特殊,除非它是一个非常大的重复计数"。