我在Fortran中有一个程序将结果保存到文件中。目前我使用
打开文件OPEN (1, FILE = 'Output.TXT')
但是,我现在想要运行一个循环,并将每次迭代的结果保存到文件'Output1.TXT'
,'Output2.TXT'
,'Output3.TXT'
等等。
在Fortran中有一种简单的方法可以从循环计数器i
构建文件名吗?
答案 0 :(得分:47)
你可以写一个单位,但你也可以写一个字符串
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
答案 1 :(得分:17)
更简单的解决方案恕我直言...................
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
答案 2 :(得分:8)
这里有一个简单的函数,它将返回一个整数的左对齐字符串版本:
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
答案 3 :(得分:5)
我已经在SO(How to use a variable in the format specifier statement?上的其他地方展示了这个,而不是完全重复的恕我直言),但我认为值得将它放在这里。可以使用该问题的其他答案中的技术来制作简单的函数
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')
由于可分配的字符串,它需要Fortran 2003。
答案 4 :(得分:2)
缩短版本。 如果所有索引都小于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
就是这样。
答案 5 :(得分:0)
我已经尝试了@Alejandro和@ user2361779,但它给了我一个不满意的结果,例如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))
...
说明:
e.g。设置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
我认为这是一个最简单的解决方案,它为您提供动态长度文件名,而不会在整数到字符串转换过程中留下任何遗留空格。
答案 6 :(得分:0)
尝试以下方法:
....
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
....
哪里&#34; ......&#34;是指适合您目的的其他适当代码。
答案 7 :(得分:-1)
将整数转换为字符串:
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
答案 8 :(得分:-2)
这是我解决这个问题的子程序。它将0:9999范围内的整数转换为字符。例如,INTEGER 123被转换为角色0123.希望它有所帮助。
P.S。 - 对不起评论;他们在罗马尼亚语中有意义: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