这是我的代码:
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
代替*
,我会得到我想要的东西。如何使用无限重复计数仍能获得所需的输出?我不会总是知道重复多少次。
答案 0 :(得分:2)
这与格式的处理方式有关,特别是在数据传输语句终止时。
对于您所拥有的输出语句,传输在以下任何一个时终止:
以您的格式
'(1x,"NN_DM:",1x,*("NN_",i2.2,1x))'
和
'(1x,"NN_DM:",1x,5("NN_",i2.2,1x))'
单个数据编辑描述符有i2.2
。 1x
是控件编辑描述符,"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
作为重复计数,这将没有什么不同; *
并不特殊,除非它是一个非常大的重复计数"。