如何自动调整A编辑描述符中的字符串长度?

问题描述 投票:0回答:2

我正在尝试使用 Fortran 编写字符串文件名:

WRITE(FILENAME,'(A27,I3.3,A1,I3.3,A3)') NAME,MYPR,'_',IBL,'.nc'

其中 NAME 是可变长度的字符串,

MYPR
IBL
是整数。 我正在寻找一种可以动态编写格式的解决方案:

'(A27,I3.3,A1,I3.3,A3)', 

其中

A27
将根据
NAME
的长度而变化。我单独尝试过
'A'
但这导致了错误。我不确定这里可能发生什么,因为许多文本甚至没有涵盖类似的问题。 希望有一些想法。

fortran fortran90
2个回答
1
投票

显而易见的解决方案是使用格式字符串

'(A,I3.3,A1,I3.3,A3)'
,即仅使用
A
作为名称并让编译器选择正确的长度。这对我来说非常有效。

正如 @agentp 所建议的,您可能会看到由于字符串中的空格而导致的问题。这可以通过使用

trim(name)
消除尾随空白来解决,甚至可以使用
trim(adjustl(name))
来删除前导和尾随空白。该解决方案在下面的子程序
print1()
中给出。

另一个选项是动态生成格式字符串 - 毕竟,这也只是一个字符串。这非常麻烦,并且在您的情况下有点过分 - 请参阅

print2()

module test_mod
  implicit none
contains
  subroutine print1(NAME,MYPR,IBL)
    character(len=*),intent(in) :: NAME
    integer,intent(in)          :: MYPR,IBL

    WRITE(*,'(A,I3.3,A1,I3.3,A3)') trim(adjustl(NAME)),MYPR,'_',IBL,'.nc'
  end subroutine

  subroutine print2(NAME,MYPR,IBL)
    character(len=*),intent(in) :: NAME
    integer,intent(in)          :: MYPR,IBL

    character(len=128)          :: fmt

    write(fmt,*) len_trim(adjustl(NAME))
    fmt = '(A'//trim(adjustl(fmt))//',I3.3,A1,I3.3,A3)'
    WRITE(*,fmt) trim(adjustl(NAME)),MYPR,'_',IBL,'.nc'
  end subroutine
end module

program test
  use test_mod
  call print1(' Testfile   ', 1, 2)
  call print2(' Testfile   ', 1, 2)
end program

输出:

./a.out 
Testfile001_002.nc
Testfile001_002.nc

0
投票

其实我想这就是你想要的:

I1 = LEN_TRIM(名称)

WRITE(FILENAME,'(A,I3.3,A1,I3.3,A3)') NAME,MYPR,'_',IBL,'.nc'

因此,文件名只会被格式化为文件名的长度,因为文件名的长度会有所不同,并且不会根据名称的字符大小填充空格。

© www.soinside.com 2019 - 2024. All rights reserved.