代码之家  ›  专栏  ›  技术社区  ›  Alasdair

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

  •  40
  • Alasdair  · 技术社区  · 16 年前

    我有一个用Fortran编写的程序,可以将结果保存到文件中。目前,我使用

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

    'Output1.TXT' , 'Output2.TXT' , 'Output3.TXT' 等等

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

    9 回复  |  直到 8 年前
        1
  •  60
  •   Stefano Borini    16 年前

    您可以写入单元,但也可以写入字符串

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

    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
    
        2
  •  22
  •   ocodo    13 年前

    更简单的解决方案IMHO。。。。。。。。。。。。。。。。。。。

    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
    
        3
  •  12
  •   cyberthanasis    13 年前

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

    下面是一个测试代码:

    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
    
        4
  •  8
  •   Community Mohan Dere    9 年前

    我已经在其他地方展示过了( How to use a variable in the format specifier statement? ,不是完全相同的(IMHO),但我认为它值得放在这里。可以使用这个问题的其他答案中的技巧来制作一个简单的函数

    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
    

    您可以在之后使用,而无需担心修剪和左调整,也无需写入临时变量:

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

        5
  •  3
  •   Alasdair    11 年前

    为缩短版本。

    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
    

        6
  •  0
  •   fronthem    10 年前

    file 1.txt file1 .txt 而不是 file1.txt . 但是,我找到了更好的解决方案:

    ...
    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 = 10 write(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
    

    我认为这是一个最简单的解决方案,它提供了一个动态长度的文件名,从整数到字符串的转换过程中没有任何遗留的空格。

        7
  •  0
  •   sɐunıɔןɐqɐp Zmey    8 年前

        ....
        character(len=30) :: filename  ! length depends on expected names
        integer           :: inuit
        ....
        do i=1,n
            write(filename,'("output",i0,".txt")') i
            open(newunit=iunit,file=filename,...)
            ....
            close(iunit)
        enddo
        ....
    

        8
  •  -2
  •   francescalus    10 年前

    要将整数转换为字符串,请执行以下操作:

    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
    
        9
  •  -3
  •   wallyk    15 年前

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

    附言——很抱歉我的评论;它们在罗马尼亚语中是有意义的: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