7

我需要在 Fortran 90 中将一些数据写入文件。我应该如何使用WRITE (*,*) input将值分组到中?每次通话后WRITE总是放一个,这就是问题所在。new line

代码示例:

open (unit = 4, file = 'generated_trajectories1.dat', form='formatted')

do time_nr=0, N
   write (4,*) dble(time_nr)*dt, initial_traj(time_nr)
end do

现在的重点是将它写在单独的列中。

4

4 回答 4

13

您可以使用隐含的 DO 循环将值写入单个记录。比较以下两个示例:

integer :: i

do i=1,10
   write(*,'(2I4)') i, 2*i
end do

它产生:

1   2
2   4
3   6
...

使用隐含的 DO 循环,它可以重写为:

integer :: i

write(*, '(10(2I4))') (i, 2*i, i=1,10)

这个产生:

1   2   2   4   3   6   ...

如果元素的数量在编译时不固定,您可以使用<n>扩展名(不支持gfortran):

write(*, '(<n>(2I4))') (i, 2*i, i=1,n)

(2I4)从变量的值中获取编辑描述符的重复次数n。在 GNU Fortran 中,您可以首先使用内部文件创建适当的编辑描述符:

character(len=20) :: myfmt

write(myfmt, '("(",I0,"(2I4))")') n
write(*, fmt=myfmt) (i, 2*i, i=1,n)

当然,它也适用于列表定向输出(即格式为 的输出*):

write(*, *) (i, 2*i, i=1,10)
于 2012-08-17T11:04:18.540 回答
4

这实际上取决于您尝试写入文件的数据(即您是否在循环或数组中有标量......)。你可以在你的问题中包含这个描述吗?

如果您尝试将标量多次写入同一行,请尝试使用非高级 I/O,将关键字参数传递advance="no"给 write 语句,例如

integer :: x

do x = 1,10
  write(*, fmt='(i4,1x)', advance="no") x
end do

但是,请注意非高级 I/O的惊喜。

于 2012-08-17T09:09:18.500 回答
0

答案取决于您对 Chris 问题的回答。如果您想要单行,那么您将不得不使用 Chris 描述的非高级 IO。没有这个,使用多个格式化的 write 语句,你总是会得到多行。

此外,您可能需要使用格式化 IO 而不是列表导向 (*) IO。对于列表导向的 IO,规则是宽松的。不同的编译器可能会产生不同的输出。对于许多输出项,换行符可能会防止输出行过长。

如果您的所有变量都是实数,这里应该可以使用一种格式:

write (4, '( *(2X, ES14.6) )', advance="no" )
于 2012-08-17T15:18:44.743 回答
0

旧的 $ 编辑描述符怎么样:

write(*, fmt='(i4,$)') x

记得在你的循环之后做一个 write(*,*) ......

于 2012-08-18T13:56:18.110 回答