在Fortran中使用调整后的(增量)缩进写入文件

ztl*_*ztl 1 fortran indentation fortran90

在程序中有许多嵌套子程序Fortran 90,我想将这些嵌套级别打印到压缩长度与级别成比例的文件中(即嵌套子程序中打印的信息比调用子程序具有更高的缩进).将写入包括不同数据类型的其他信息(字符串,整数,...).

我想到了不同的方法(在这个例子中,lev是级别,只是在循环中构建,但在每个子例程中以其他方式更新):

Program adaptIndent

INTEGER :: lev 
CHARACTER (LEN=*), PARAMETER :: fmt1 = '(I1,'': ''A)'
CHARACTER (LEN=*), PARAMETER :: fmt2 = '(I2,'': ''A)'

DO lev=1,10
  CALL printindent1
  !CALL printindent2
  !CALL printindent3
ENDDO

CONTAINS

SUBROUTINE printindent1 !convert everything (incl. indent and lev) to CHAR
  CHARACTER(LEN=lev) :: indent
  CHARACTER(LEN=2) :: strlev
  WRITE(indent, '(A)') ' '
  WRITE(strlev, '(I2)') lev
  WRITE(*, '(A)') indent//TRIM(ADJUSTL(strlev))//': this is my level'
END SUBROUTINE printindent1

SUBROUTINE printindent2 !build a new format defining the indentation
  CHARACTER(LEN=2) :: strlev
  CHARACTER(LEN=20) :: fmtlev
  WRITE(strlev, '(I2)') lev
  WRITE(fmtlev, '(A)') '('//TRIM(ADJUSTL(strlev))//'X, A)'
  WRITE(*, fmtlev) TRIM(ADJUSTL(strlev))//': this is my level'
END SUBROUTINE printindent2

SUBROUTINE printindent3 !add indent as CHAR to an existing format
  CHARACTER(LEN=lev) :: indent
  WRITE(indent, '(A)') ' '
  IF(lev.LT.10) THEN
    WRITE(*, fmt1(1:1)//'A,'//fmt1(2:)) indent, lev, 'this is my level'
  ELSE
    WRITE(*, fmt2(1:1)//'A,'//fmt2(2:)) indent, lev, 'this is my level'
  ENDIF  
END SUBROUTINE printindent3

END Program adaptIndent
Run Code Online (Sandbox Code Playgroud)

(期望的)输出对于这些解决方案是相同的:

 1: this is my level
  2: this is my level
   3: this is my level
    4: this is my level
     5: this is my level
      6: this is my level
       7: this is my level
        8: this is my level
         9: this is my level
          10: this is my level
Run Code Online (Sandbox Code Playgroud)

我的问题是,每次我做有用的WRITE(*, *fmt*),我需要初步(和丑陋)步骤来做到这一点:

  • 将缩进计算为字符并将所有内容转换为解决方案1中的CHAR;
  • 在解决方案2中定义具有适当数量的前导空格的新格式;
  • 调整现有的格式,在解决方案3中包含缩进为CHAR(注意这里的问题更多:有没有办法定义一个唯一的格式来写任何大小的整数而没有任何尾随或前导空格?)

有没有比上面的许多步骤更优雅的解决方案呢?

Edm*_*zzi 5

你可以使用内在的 REPEAT

并写下类似的东西:

write(*,"(A,I0,A)")repeat(" ",lev),lev, str
Run Code Online (Sandbox Code Playgroud)