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

Rob*_*ins 2 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   
Run Code Online (Sandbox Code Playgroud)

该代码的输出如下所示:

-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
Run Code Online (Sandbox Code Playgroud)

我不知道这********意味着什么; 应该存在的字符串存储为REAL,但计算为整数,如10152

Vla*_*r F 5

不要使用FORMAT声明,它实际上在 25 年前就已经过时了。即使你的“非常旧”的代码也不是那么旧。使用格式字符串。

write (7,'(9999(f0.3,a))') (s(j,i), ",",j=1,16)
Run Code Online (Sandbox Code Playgroud)

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

write (7,'(9999(g0))') (s(j,i), ",",j=1,16)
Run Code Online (Sandbox Code Playgroud)

笔记:

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

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

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

  • 是的,最大数量。如果编译器支持,您可以使用 * 代替。 (2认同)

Ian*_*anH 5

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

do i = 1, k
  write (7, "(*(G0,:,','))") s(:,i)
end do
Run Code Online (Sandbox Code Playgroud)

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

*指定的一个无限格式项,这意味着在以下括号对整个格式规范被重复,直到没有更多的项目.

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