将 REAL 的数组行转换为逗号分隔的字符串

Convert an array row of REAL to a comma delimited string

我有一个非常古老的 Fortran 程序,可以将数据从一种文本格式转换为另一种文本格式。在一个地方,它处理一组分配如下的数据:

  real*4, allocatable   :: s(:,:) ! is the declaration
  ! ...
  allocate (s(16,k)) ! is the allocation
  ! then, in a loop later on:
  do i=1,k
     write (7,*) (s(j,i),j=1,16)
  end do   

该代码的输出如下所示:

-1.375000 -1.375000 327277.0 328682.0 2.750000 0.1250000 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00 1.000000 5.000000 400.0000 1.000000

我需要它看起来像这样:

-1.375,-1.375,-.125,1.375,1.375,0,0,0,0,0,0,0,1,5,1,1

最重要的是我用逗号分隔字段,而不是其他空格。

使用FORMAT语句,怎么能做到呢?

编辑:我注意到这一行:write (7, "(*(F8.5,:,','))") s(:,i)

...产生如下所示的输出:

 3.00000, 4.50000, 1.00000,********, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 5.00000,********, 1.00000
 3.00000, 4.50000,********,********, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 5.00000,********, 1.00000

我不知道********是什么意思;应该存在的字符串存储为 REAL 但评估为整数,如 10152

我根据你的代码写了一个例子,但是我不知道怎么做 您正在获取 s 的值,即,我不知道您的其余代码。 这将打印在列中而不是行中。还看看 http://web.stanford.edu/class/me200c/tutorial_77/17_format.html 自己想办法

 program prgm1  
 integer k 
  real*4, allocatable   :: s(:,:) ! is the declaration
 ! ...
 k = 1
  allocate (s(16,k)) ! is the allocation
 ! then, in a loop later on:
  do i=1,k
     write (*,800) (s(j,i),j=1,16)
  end do
 800 format(f8.3,",")  
end  program prgm1


    program prgm1  
     integer k 
     real*4, allocatable   :: s(:,:) ! is the declaration
     ! ...
     k = 1
    allocate (s(16,k)) ! is the allocation
      ! then, in a loop later on:
     do i=1,k
    write (*,800) (s(j,i),',',j=1,16)
    end do
    800 format(16(f8.3,A))  
    end  program prgm1

不要使用 FORMAT 声明,它在 25 年前就已经过时了。甚至您的 "very old" 代码也不是那么旧。使用格式字符串。

write (7,'(9999(f0.3,a))') (s(j,i), ",",j=1,16)

如果不介意 Fortran 2008,更好的是

write (7,'(9999(g0))') (s(j,i), ",",j=1,16)

注:

  1. 最好不要使用小于10的单元号,它们往往在某处预先连接

  2. 您甚至可以使用 '(*(g0))',这也是 Fortran 2008。g0 是最小宽度编辑的通用描述符。它可用于所有内部数据类型。

  3. 描述符中宽度字段中的零指示编译器使用打印表达式所需的最小宽度。

如果您的编译器具有适当级别的 Fortran 2008 支持:

do i = 1, k
  write (7, "(*(G0,:,','))") s(:,i)
end do

G0 使用处理器相关的 "reasonable" 实数字段的宽度和精度值,没有前导或尾随空白。

*表示无限制的格式项,即重复后面括号中的整个格式说明,直到没有更多的项。

如果没有更多元素,: 控制描述符将终止输出处理。这避免了尾随逗号。