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

Extraneous output when using an unlimited format item

这是我的代码:

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 代替 *,我会得到我想要的。我怎样才能使用无限重复计数并仍然获得所需的输出?我不会总是知道要重复多少次。

这与格式的处理方式有关,尤其是数据传输语句何时终止。

对于像您这样的输出语句,传输在以下任一情况下终止:

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

采用您的格式

'(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 作为重复计数,这将没有什么不同; * 除了它是 "very large repeat count".

之外没有什么特别之处