使用无限制格式项时的无关输出
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.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
作为重复计数,这将没有什么不同; *
除了它是 "very large repeat count".
之外没有什么特别之处
这是我的代码:
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.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
作为重复计数,这将没有什么不同; *
除了它是 "very large repeat count".