回 帖 发 新 帖 刷新版面

主题:[转帖]Fortran写txt 文件,每行输出个数不确定

原文链接:
http://blog.sina.com.cn/cuiocean

在Fortran中有的时候要输出一个二维或三维数组,比如流速等。这个时候我们希望每一行能够写入多个数据。
加入我们有二维流场u(i,j). i=1,imax.  j=1,jmax. 输出的时候我们希望文件中每一行输出u中的每一行或每一列。一般情况下,我们可以用 write(fid,'(10f12.6)', u(i,:)这种方法输出。但这个是数字10,必须是已知的。因为write里面的fmt部分,不允许用变量名。比如不能写成 write(fid,'(jmaxf12.6)', u(i,:)
解决办法就是先将数字写成string,然后拼接成我们需要的fmt格式。例子如下:

PROGRAM test_write
IMPLICIT NONE
  INTEGER :: i,j, imax,jmax
  CHARACTER(50)       :: xstring
  REAL(KIND=8),DIMENSION(:,:), ALLOCATABLE ::  u
! u为流场,先定义它的大小,imax,jmax
  imax = 100;
  jmax = 10;
  ALLOCATE(u(imax,jmax))  !分配空间
 
  ! Define the array u,这里随意给了几个值
  DO i=1,100
      DO j=1,10
          u(i,j) = i+j
      ENDDO
  ENDDO
 
  ! Open the file to output,分四种情况,对比输出结果
  OPEN(11,file='test_output1.txt')
  OPEN(12,file='test_output2.txt')
  OPEN(13,file='test_output3.txt')
  OPEN(14,file='test_output4.txt') 
 
  !Method 1: Two loops 
  ! 循环两次,每次输出u(i,j), 输出结果是一竖列的值,
  DO i = 1, imax   
      DO j= 1, jmax            
         WRITE(11,'(f12.6)') u(i,j)
      ENDDO
  ENDDO
 
  !Method 2: inner loop
  !输出的时候,循环可以写到write这句里面
  DO i = 1, imax               
         WRITE(12,'(f12.6)') (u(i,j),j=1,jmax)
  ENDDO
 
 
  !Method 3: Already know the size of the array
  !如果已知每行要输出的个数,可按如下输出,每行10个
  DO i = 1, imax               
         WRITE(13,'(10f12.6)') (u(i,j),j=1,jmax)
  ENDDO

  !Method 4: The size of the array varies
  !当事先不知道每行要输出多少个,或者说数组大小会一直变,又不想每次都去更改程序的输出语句的时候,利用下面的方法
  DO i = 1, imax
         WRITE (xstring,1000) jmax   !把数字转换为字符串
         1000  FORMAT(I3)
         xstring =  '('//trim(ADJUSTL(xstring))//'f12.6)' !拼接为要求的format格式
         xstring = TRIM(ADJUSTL(xstring))                 
         WRITE(14,xstring) (u(i,j),j=1,jmax)  !利用此格式输出。
  ENDDO 
END

原文链接:
http://blog.sina.com.cn/s/blog_618af1950100k24a.html

回复列表 (共5个回复)

沙发

就我个人而言,喜欢如下代码:

subroutine ABC
  implicit none
  integer:: ND
  real, allocatable:: RA(:)
  
  integer:: Stat_No   ! allocation Status
  character(len = 30):: fmt_str
  
  ND = 15
  allocate( RA(ND), Stat = Stat_No )
  if ( Stat_No == 0 ) then   ! allocation successful
    call random_number( RA )
    !
    fmt_str = "(?????F16.8)"
    write(fmt_str(2 : 6), fmt = "(TL1, I5.5)") ND

    write(unit = *, fmt = fmt_str) RA
  end if
 
  return
end subroutine

而 Intel Fortran Compiler 似乎更推荐其扩展用法(并非 Fortran 语法标准) 
fmt_str = "(<ND>F16.8)"

板凳

write(unit = *, fmt = "(<ND>F16.8)") RA

3 楼

支持。

4 楼

[quote]write(unit = *, fmt = "(<ND>F16.8)") RA
[/quote]
这个解决输出个数不定问题很有效的,支持!

5 楼

编一完整程序,有一批(不超过100个,通过随机数产生)成绩,编程要求算术平均值、方差、标准差

我来回复

您尚未登录,请登录后再回复。点此登录或注册