首页 文章

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

提问于
浏览
2

我正在尝试使用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 <(值为3的变量)>” . 我找不到任何关于从变量插入格式宽度的信息......这可能吗?如果没有,解决这个问题的最佳方法是什么?

Update:

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

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

    最简单的是使用现代的fortran

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

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

  • 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
    

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

相关问题