将整数转换为string以在运行时创build输出文件名

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

OPEN (1, FILE = 'Output.TXT') 

但是,我现在要运行一个循环,并将每次迭代的结果保存到文件'Output2.TXT''Output3.TXT''Output3.TXT'等等。

在Fortran中有一个简单的方法来构build来自循环计数器i文件名吗?

你可以写入一个单元,但是你也可以写入一个string

 program foo character(len=1024) :: filename write (filename, "(A5,I2)") "hello", 10 print *, trim(filename) end program 

请注意(这是我正在谈论的第二个技巧),你也可以编程build立一个格式string。

 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 

一个更简单的解决scheme恕我直言……………….

 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 

那么这里是一个简单的函数,它将返回一个整数的左alignmentstring版本:

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

这里是一个testing代码:

 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 

对于缩短的版本。 如果所有指数都小于10,则使用以下内容:

 do i=0,9 fid=100+i fname='OUTPUT'//NCHAR(i+48) //'.txt' open(fid, file=fname) !.... end do 

对于通用版本:

 character(len=5) :: charI do i = 0,100 fid = 100 + i write(charI,"(A)"), i fname ='OUTPUT' // trim(charI) // '.txt' open(fid, file=fname) end do 

就这样。

我已经在其他地方( 如何在格式说明符语句中使用variables ,而不是一个完全相同的恕我直言),但我认为这是值得放置在这里。 这个问题可以使用其他答案的技巧来实现一个简单的function

 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 

您可以使用它,而不用担心修剪和左侧调整,也不需要写入临时variables:

 OPEN(1, FILE = 'Output'//itoa(i)//'.TXT') 

由于可分配的string,它需要Fortran 2003。

我已经尝试了@Alejandro和@ user2361779,但它给了我一个不满意的结果,如file 1.txtfile1 .txt而不是file1.txt 。 不过我find更好的解决scheme:

 ... integer :: i character(len=5) :: char_i ! use your maximum expected len character(len=32) :: filename write(char_i, '(I5)') i ! convert integer to char write(filename, '("path/to/file/", A, ".dat")') trim(adjustl(char_i)) ... 

说明:

例如设置i = 10write(char_i, '(I5)') i

 char_i gives " 10" ! this is original value of char_i adjustl(char_i) gives "10 " ! adjust char_i to the left trim(adjustl(char_i)) gives "10" ! adjust char_i to the left then remove blank space on the right 

我认为这是一个最简单的解决scheme,给你一个dynamic的长度文件名,没有从整数到string转换过程的任何遗留空白。

将整数转换为string:

 integer :: i character* :: s if (i.LE.9) then s=char(48+i) else if (i.GE.10) then s=char(48+(i/10))// char(48-10*(i/10)+i) endif 

这是我对这个问题的子程序方法。 它将0:9999范围内的整数转换为字符。 例如,INTEGER 123被转换成字符0123。希望它有帮助。

PS – 抱歉的意见; 他们在罗马尼亚语中是有道理的:P

  subroutine nume_fisier (i,filename_tot) implicit none integer :: i integer :: integer_zeci,rest_zeci,integer_sute,rest_sute,integer_mii,rest_mii character(1) :: filename1,filename2,filename3,filename4 character(4) :: filename_tot ! Subrutina ce transforma un INTEGER de la 0 la 9999 in o serie de CARACTERE cu acelasi numar ! pentru a fi folosite in numerotarea si denumirea fisierelor de rezultate. if(i<=9) then filename1=char(48+0) filename2=char(48+0) filename3=char(48+0) filename4=char(48+i) elseif(i>=10.and.i<=99) then integer_zeci=int(i/10) rest_zeci=mod(i,10) filename1=char(48+0) filename2=char(48+0) filename3=char(48+integer_zeci) filename4=char(48+rest_zeci) elseif(i>=100.and.i<=999) then integer_sute=int(i/100) rest_sute=mod(i,100) integer_zeci=int(rest_sute/10) rest_zeci=mod(rest_sute,10) filename1=char(48+0) filename2=char(48+integer_sute) filename3=char(48+integer_zeci) filename4=char(48+rest_zeci) elseif(i>=1000.and.i<=9999) then integer_mii=int(i/1000) rest_mii=mod(i,1000) integer_sute=int(rest_mii/100) rest_sute=mod(rest_mii,100) integer_zeci=int(rest_sute/10) rest_zeci=mod(rest_sute,10) filename1=char(48+integer_mii) filename2=char(48+integer_sute) filename3=char(48+integer_zeci) filename4=char(48+rest_zeci) endif filename_tot=''//filename1//''//filename2//''//filename3//''//filename4//'' return end subroutine nume_fisier