我正在尝试使用 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'
但这导致了错误。我不确定这里可能发生什么,因为许多文本甚至没有涵盖类似的问题。
希望有一些想法。
显而易见的解决方案是使用格式字符串
'(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
其实我想这就是你想要的:
I1 = LEN_TRIM(名称)
WRITE(FILENAME,'(A,I3.3,A1,I3.3,A3)') NAME,MYPR,'_',IBL,'.nc'
因此,文件名只会被格式化为文件名的长度,因为文件名的长度会有所不同,并且不会根据名称的字符大小填充空格。