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

时间:2015-03-12 00:59:02

标签: format fortran string-formatting

我有一个非常古老的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等整数

3 个答案:

答案 0 :(得分:5)

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

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

G0使用与处理器相关的“合理”值来表示实数字段的宽度和精度,没有前导或尾随空白。

*指定无限制格式项,这意味着将重复以下括号对中的整个格式规范,直到没有其他项为止。

如果没有更多元素,:控制描述符将终止输出处理。这样可以避免使用逗号。

答案 1 :(得分:3)

不要使用FORMAT声明,它在25年前被有效地淘汰了。即使是你的老人"代码不是那么老。使用格式字符串。

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. 描述符中宽度字段中的零指示编译器使用打印表达式所需的最小宽度。

答案 2 :(得分:1)

我根据你的代码写了一个例子,但是我不知道怎么做 你得到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