将字符串长度插入到fortran格式说明符中

时间:2012-12-14 07:27:12

标签: fortran gfortran

我正在尝试使用gfortran 4.4.6编译其他人的FORTRAN代码。原始编码器使用了Compaq FORTRAN之类的东西。

有问题的代码应该读取像'foo.txt'这样的文件名并创建一个名为'foo_c.txt'的新文件:

    file_label_end = SCAN(filename, '.') - 1
    WRITE (output_filename,5) filename
    5 FORMAT (A<file_label_end>, '_c.txt' )

gfortran抱怨字符说明符的开角括号。也就是说,不是“A3”而是“A&lt;(值为3的变量)&gt;”。我找不到任何关于从变量插入格式宽度的信息......这可能吗?如果没有,解决这个问题的最佳方法是什么?

更新

这似乎正在起作用(编译):

file_label_end = SCAN(par_filename, '.', .TRUE. ) + 1
output_filename = par_filename(1:file_label_end) // '_c.par'

但后来我遇到了类似的情况:

12 FORMAT (<n-1>F10.5)
...
READ(1,12) (cat_parm (blk,j), j = 1,n-1)

我试图通过创建格式字符串来修复:

write(fmt12,'(I0,A4)') n-1, 'F10.5'
!12 FORMAT (fmt12)
12 FORMAT (fmt=fmt12)

但是“fmt”中的“t”会被标记为“格式字符串中需要非负宽度”的错误

2 个答案:

答案 0 :(得分:2)

在Fortran编辑描述符中使用<>是非标准的,尽管已广泛实施。你当然可以从变量构建编辑描述符,标准方法是通过内部写入,类似这样(省略声明):

format_string = ''
write(format_string,'(a1,i0,a6)') 'A', file_label_end,'''_c.txt''' ! WARNING I haven't tested this

然后

write(output_filename,fmt=format_string) filename

但在你的情况下,这并非完全必要。你可以试试这个

file_label_end = SCAN(filename, '.') - 1
WRITE (output_filename,'(a)') filename(1:file_label_end)//'_c.txt'

使用'a'编辑描述符省略宽度意味着将写入表达式中的所有字符。您可能想要声明

character(len=*), allocatable :: output_filename

如果你还没有这样做的话。

答案 1 :(得分:0)

最简单的是使用现代堡垒

WRITE (output_filename,'(a)') trim(filename) // '_c.txt'

否则我会使用类似的内部写入在格式字符串中写入数字。