将数据写入列中的文件(Fortran)

时间:2012-08-17 08:47:12

标签: file-io formatting fortran fortran90

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

代码示例:

new line

现在重点是将它写在不同的列中。

4 个答案:

答案 0 :(得分:12)

您可以使用隐含的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)

答案 1 :(得分:4)

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

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

integer :: x

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

但是,要注意non-advancing I/O的惊喜。

答案 2 :(得分:0)

答案取决于你回答克里斯的问题。如果你想要一行,那么你将不得不使用Chris所描述的非推进IO。如果没有这个,使用多个格式化的write语句,您将始终获得多行。

此外,您可能需要使用格式化IO而不是list-directed(*)IO。对于列表导向的IO,规则是松散的。不同的编译器可能产生不同的输出。对于许多输出项,换行可能会使输出线保持太长时间。

如果所有变量都是实数,那么这种格式应该有效:

write (4, '( *(2X, ES14.6) )', advance="no" )

答案 3 :(得分:0)

好的旧$ edit描述符怎么样:

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

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