将整数转换为字符串以在运行时创建输出文件名

Ala*_*air 45 string fortran integer

我在Fortran中有一个程序将结果保存到文件中.目前我使用打开文件

OPEN (1, FILE = 'Output.TXT')
Run Code Online (Sandbox Code Playgroud)

不过,我现在想运行一个循环,每次迭代的结果保存到文件'Output1.TXT','Output2.TXT','Output3.TXT',等等.

在Fortran中有一种简单的方法可以从循环计数器构造文件名i吗?

Ste*_*ini 48

你可以写一个单元,但你也可以写一个字符串

program foo
    character(len=1024) :: filename

    write (filename, "(A5,I2)") "hello", 10

    print *, trim(filename)
end program
Run Code Online (Sandbox Code Playgroud)

请注意(这是我正在讨论的第二个技巧),您也可以通过编程方式构建格式字符串.

program foo

    character(len=1024) :: filename
    character(len=1024) :: format_string
    integer :: i

    do i=1, 10
        if (i < 10) then
            format_string = "(A5,I1)"
        else
            format_string = "(A5,I2)"
        endif

        write (filename,format_string) "hello", i
        print *, trim(filename)
    enddo

end program
Run Code Online (Sandbox Code Playgroud)

  • 两条评论: - 你不必歧视我的价值; 格式(I0)将输出一个没有任何空格的整数; 另外,如果你想要一个固定的宽度和用零填充(如"output001.txt"),你需要使用(I0.3) - 格式(A5I2)根据任何规范都不是有效的Fortran,因为格式说明符是用逗号分隔:(A5,I2) (14认同)

小智 18

一个更容易的解决方案恕我直言...................

character(len=8) :: fmt ! format descriptor

fmt = '(I5.5)' ! an integer of width 5 with zeros at the left

i1= 59

write (x1,fmt) i1 ! converting integer to string using a 'internal file'

filename='output'//trim(x1)//'.dat'

! ====> filename: output00059.dat
Run Code Online (Sandbox Code Playgroud)


小智 9

那么这是一个简单的函数,它将返回一个整数的左对齐字符串版本:

character(len=20) function str(k)
!   "Convert an integer to string."
    integer, intent(in) :: k
    write (str, *) k
    str = adjustl(str)
end function str
Run Code Online (Sandbox Code Playgroud)

这是一个测试代码:

program x
integer :: i
do i=1, 100
    open(11, file='Output'//trim(str(i))//'.txt')
    write (11, *) i
    close (11)
end do
end program x
Run Code Online (Sandbox Code Playgroud)


Vla*_*r F 6

我已经在SO的其他地方展示了这个(如何在格式说明符语句中使用变量?,而不是完全重复的恕我直言),但我认为将它放在这里是值得的.可以使用该问题的其他答案中的技术来实现简单的功能

function itoa(i) result(res)
  character(:),allocatable :: res
  integer,intent(in) :: i
  character(range(i)+2) :: tmp
  write(tmp,'(i0)') i
  res = trim(tmp)
end function
Run Code Online (Sandbox Code Playgroud)

你可以使用它而不用担心修剪和左调整而不写一个临时变量:

OPEN(1, FILE = 'Output'//itoa(i)//'.TXT')
Run Code Online (Sandbox Code Playgroud)

由于可分配的字符串,它需要Fortran 2003.